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;
}