Codeforces Round #377 (Div. 2)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值