A
题目链接
http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=721&pid=1001
题解
计算每个商店各买一个所需的最多的钱,然后和每天记录的钱比较。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<string>
#include<cctype>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{ vector<int>ans;
int n,m;
scanf("%d%d",&n,&m);
long long sum=0;
for(int i=0;i<n;i++)
{
long long z;
scanf("%I64d",&z);
sum+=z;
}
for(int i=0;i<m;i++)
{
long long z;
scanf("%I64d",&z);
if(z>sum)ans.push_back(1);
else ans.push_back(0);
}
for(int i=0;i<ans.size();i++)printf("%d",ans[i]);
printf("\n");}
return 0;
}
B
题目链接
http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=721&pid=1002
题解
前i-1个数中最大值fi,后i+1+n个数中最大值gi,ans+=max(max(fi,gi),a[i+1]-a[i-1])。边界的时候要特殊处理。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<string>
#include<cctype>
#include<algorithm>
#include<vector>
using namespace std;
int a[100005];
int b[100005];
int c[100005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{ memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int maxn=abs(a[0]-a[1]);
b[0]=0;
b[1]=maxn;
for(int i=2;i<n;i++)
{
b[i]=max(maxn,abs(a[i]-a[i-1]));
maxn=b[i];
}
maxn=abs(a[n-1]-a[n-2]);
c[n-1]=0;
c[n-2]=maxn;
for(int i=n-3;i>=0;i--)
{
c[i]=max(maxn,abs(a[i]-a[i+1]));
maxn=c[i];
}
long long ans=0;
ans+=c[1];
ans+=b[n-2];
ans+=max(abs(a[0]-a[2]),c[2]);
ans+=max(abs(a[n-1]-a[n-3]),b[n-3]);
for(int i=2;i<n-2;i++)
{
ans+=max(max(b[i-1],c[i+1]),abs(a[i-1]-a[i+1]));
}
printf("%I64d\n",ans);
}
return 0;
}
C
题目链接
http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=721&pid=1003
题解
只需要找到满足有k个数都是不小于m的最小串即可,比它大的串都是可行的,[比它小的数,不影响第k大的数的位置,比第k个数都大的数,那么一定也是大于m的,也是满足的] 遍历左端点,右端点用二分找到。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<string>
#include<cctype>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int a[200005];
int b[200005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{ memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=m)b[i]=1; //比m大的置1
}
for(int i=1;i<n;i++)b[i]+=b[i-1];
long long ans=0;
int cnt=0;
for(int i=0;i<n;i++)
{
int sum;
if(b[i]-b[i-1]==0)sum=k+b[i];
else sum=k+b[i]-1;
int op=lower_bound(b,b+n,sum)-b+1;
ans+=n-op+1;
}
printf("%I64d\n",ans);
}
return 0;
}