http://codeforces.com/contest/732
A. Buy a Shovel
水题,判断整除
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int k,r;
scanf("%d %d",&k,&r);
if(k==10)printf("1\n");
else {
int i = 1;
for(;;++i)
if(k*i%10 == r || i*k%10==0)break;
printf("%d\n",i);
}
return 0;
}
B. Cormen — The Best Friend Of a Man
注意题目中最后一天是默认最后一天的明天会自动补全,第一天的前一天也会补全,所以天数为一天的话不用处理直接输出,否则就两天两天的检查,不够的话就加在第二天
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int a[600];
int main()
{
int k,n;
scanf("%d %d",&n,&k);
int ans = 0;
for(int i = 0;i < n;++i)
scanf("%d",&a[i]);
if(n == 1){
printf("0\n");
printf("%d\n",a[0]);
return 0;
}
for(int i = 0;i < n-1;++i)
{
if(a[i]+a[i+1]>=k)continue;
else {
ans+=k-a[i]-a[i+1];
a[i+1] = k-a[i];
}
}
printf("%d\n",ans);
for(int i = 0;i<n-1;++i)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
return 0;
}
C. Sanatorium
这题做的时候想枚举,发现很麻烦,WA了一次,就从最大天数着手了,打的时候想了很久,浪费了很多时间
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long int ll;
ll a[20];
int main()
{
ll b,d,s;
scanf("%lld %lld %lld",&b,&d,&s);
ll ans = 0;
//bb,bd,bs,as
ll sum = b + d + s ,maxn = max(max(b,d),s) ;
if(b==d && d==s){
printf("0\n");
return 0;
}
ans = 3 * maxn - sum;
if(maxn == b && b==d){ans = b-1-s;printf("%lld\n",ans);return 0;}
if(maxn == b && b==s){ans = b-1-d;printf("%lld\n",ans);return 0;}
if(maxn == s && s==d){ans = s-1-b;printf("%lld\n",ans);return 0;}
if(maxn == b){
if(d<b && s<b)ans = b-1-s + b-1-d;
else if(s==b)ans = b-1-d;
else ans = b-1-s;
}
else if(maxn == s){
if(b < s && d < s)ans = s-1-b + s-1-d;
else if(s==d)ans = s-1-b;
else ans = s-1-d;
}else {
if(b<d && s<d)ans = d-1-b + d-1-s;
else if(s==d)ans = d-1-b;
else ans = d-1-s;
}
if(ans <0)ans=0;
printf("%lld\n",ans);
return 0;
}
D. Exams
这题出的不错,只要看出是二分搜索就很简单了,其实一般枚举天数超时就会想到二分搜索。
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 100005;
int n, m;
int d[maxn],need[maxn];
bool passed[maxn];
void input()
{
scanf("%d %d",&n,&m);
for(int i = 1;i <= n;++i)
scanf("%d",&d[i]);
for(int i = 1;i <= m;++i)
scanf("%d",&need[i]);
}
int Judge(int ans)
{
int sum = 0;
memset(passed,0,sizeof(passed));
for(int i = ans;i >= 1;--i)
{
if(d[i]!=0 && passed[d[i]]==0)//the exam on that day doesn't pass
{
passed[d[i]]=1;
sum += need[d[i]];
}
else if(sum!=0)sum--;// d[i]==0 || pass[d[i]]==1
}
if(sum!=0)return 0;// not enough days
for(int i = 1;i <= m;++i)
if(passed[i]==0)return 0; // not pass all exams
return 1;
}
int main()
{
input();
int l = 1,r = n,mid;
while(l<r)
{
mid = (r-l)/2 + l; // avoid overflow
if(Judge(mid) == 0)l = mid + 1;
else r = mid;
}// l>=r,break ,r <= l,so test r firstly
if(Judge(r))printf("%d\n",r);
else if(Judge(l))printf("%d\n",l);
else printf("-1\n");
return 0;
}