传送门

A. 淘宝商品价格大PK

求最长上升子序列,然后看了下数据范围很小,就暴力枚举删除哪个数字即可,时间复杂度为N的3次方

#include<bits/stdc++.h>
#define int long long
using namespace std;
int maxn[1010];
int maxLine(int a[],int n)
{
    for(int i = 1;i < n; i++)
    {
        for(int j = 0;j < i; j++)
        {
            if(a[i] > a[j])
            {
                maxn[i] = max(maxn[i],maxn[j] + 1);
            }
        }
    }
    sort(maxn,maxn + n);
    return maxn[n - 1];
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int a[1010],b[1010],ans = 0,n;
    cin >> n;
    for(int i = 0;i < n; i++)
    {
        cin >> a[i];
        maxn[i] = 1;
    }
    int maxx = maxLine(a,n);
    for(int i = 0;i < n; i++)
    {
        int k = 0;
        memset(maxn,0, sizeof(maxn));
        for(int j = 0;j < n; j++)
        {
            if(i == j)
                continue;
            maxn[k] = 1;
            b[k++] = a[j];
        }
        if(maxx > maxLine(b,k))
            ans++;
    }
    cout << ans << endl;
    return 0;
}

B,C,D:阿里巴巴协助征战SARS

三个题没有什么大的区别,唯一不同的就是数据范围由小变大了,不过确实也是这么回事,光数据范围就可以pass掉很多想法了。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9+7;
int qPow(int x,int n)
{
    int res = 1;
    while (n > 0)
    {
        if(n & 1)
            res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    res %= mod;
    return res;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    string n;
    while(cin >> n)
    {
        if(n[0] == '0')
            break;
        int ans,num = 0,l = n.length();
        for(int i = 0;i < l; i++)
        {
            num = num * 10 + (n[i] - '0');
            num %= (mod - 1);
        }
        ans = (qPow(2,num - 1) + qPow(4,num - 1)) % mod;
        cout << ans << endl;
    }
    return 0;
}