zoukankan      html  css  js  c++  java
  • 【Codeforces】Codeforces Round #491 (Div. 2) (Contest 991)

    题目

    传送门:QWQ

    A:A - If at first you don't succeed...

    分析:

    按照题意模拟

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
        int a,b,c,n;
        scanf("%d%d%d%d",&a,&b,&c,&n);
        
        int ans=n-a-b+c;
        if(a<c || b<c) ans=-1;
        if(ans>0) printf("%d
    ",ans);
        else puts("-1");
        
    }
    View Code

    B:B - Getting an A

     

    分析:

    显然把越小的改成5贡献越大。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=300;
    int a[maxn];
    int main(){
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        int sum=0,ans=0;for(int i=1;i<=n;i++) sum+=a[i];
        for(int i=1;i<=n;i++){
        //    cout<<(double)(sum*1.0/n)<<endl;
            if((double)(sum*1.0/n)>=4.5) break;
            int k=5-a[i]; ans++;
            sum+=k;
        }
        printf("%d
    ",ans);
    }
    View Code

    C:C - Candies

    分析:

    大力二分

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll n;
    int ok(ll k){
        ll sum=0,x=n;
        while(x>=0){
            if(x>=k) sum+=k;else sum+=x; x=max(x-k,-1ll); x-=x/10;
        }
        //    printf("----  %lld  %lld
    ",k,sum);
        return sum>=(n+1)/2;
    
    }
    int main(){
          cin>>n;
        ll l=0,r=n+5;
        while(l+1<r){
            ll mid=l+r>>1;
        //    cout<<l<<"  "<<r<<endl;
            
            if(ok(mid)) r=mid;
            else l=mid;
        }
        cout<<r;
    }
    View Code

    D:D - Bishwock

     

    分析:

    按位从从左到右扫过去,能填进去就填进去

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=200;
    char s[maxn], s2[maxn];
    int main(){
        scanf("%s%s",s+1,s2+1);
        int n=strlen(s+1);
        int ans=0;
        s[0]='X'; s2[0]=='X';
        for(int i=1;i<=n;i++){
            if(s[i]=='X') continue;
            if(s2[i]=='0' && s2[i-1]=='0'){
                s2[i]='X'; s2[i-1]='X'; s[i]='X'; ans++;
            //    printf("%d 1
    ",i);
                continue;
            }
            if(s2[i]=='0' && s2[i+1]=='0'){
                s2[i]='X'; s2[i+1]='X'; s[i]='X'; ans++;
            //    printf("%d 2
    ",i);
                continue;
            }
            if(s[i+1]=='0' && s2[i]=='0'){
                s2[i]='X'; s[i+1]='X'; s[i]='X'; ans++;
            //    printf("%d 3
    ",i);
                continue;
            }
            if(s[i+1]=='0' && s2[i+1]=='0'){
                s2[i+1]='X'; s[i+1]='X'; s[i]='X'; ans++;
            //    printf("%d 3
    ",i);
                continue;
            }
        }
    //    printf("%s
    %s
    ",s+1,s2+1);
        printf("%d
    ",ans);
        
    }
    View Code

    E:E - Bus Number

    分析:

    https://blog.csdn.net/ZscDst/article/details/80835561

     官方题解做法。。。。。

    代码:

    //copy from https://blog.csdn.net/ZscDst/article/details/80835561
    
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int a[15], vis[15];
    ll fac[20];
    set<string> s;
    void split(string x, int *a)
    {
        for (int i = 0; i < 10; i++) a[i] = 0;
        for (char i: x) a[i-'0']++;
    }
    ll getcount()//去重全排列
    {
        ll ans = fac[accumulate(a, a+10, 0)];
        for (int i = 0; i < 10; i++) ans /= fac[a[i]];
        return ans;
    }
    ll getans(string x)
    {
        split(x, a);
        for (int i = 0; i < 10; i++) if (vis[i] && !a[i]) return 0;//比原来少了i数字
        sort(x.begin(), x.end());
        if (s.count(x)) return 0;//x这种子集算过了
        else s.insert(x);
    
        ll ans = getcount();
        if (a[0]) { a[0]--; ans -= getcount(); }//减去前导0情况
        return ans;
    }
    int main()
    {
        fac[0] = 1; for(int i = 1; i < 20; i++) fac[i] = fac[i-1]*i;//计算阶乘
        string n; cin >> n;
        split(n, vis);
        int k = n.size();
        ll ans = 0;
        for (int i = 1; i < (1<<k); i++)//二进制枚举
        {
            string t;
            for (int j = 0; j < k; j++)
                if (i&(1<<j)) t += n[j];
            ans += getans(t);
        }
        printf("%lld
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    Dynamic 365 中创建编码规则
    程序员和产品经理之间的恩怨情仇
    Scrum已经俘获中国开发者的心? ——从《2017年开发者调查报告》看真相!
    不懂营销的产品经理不是好的产品经理
    关于程序猿之间丧心病狂的鄙视链——编辑器篇
    国内五款好用的开源建站系统
    程序员听到bug后的N种反应,太形象了
    功能至上!国内外最实用的协作类软件盘点
    关于程序员之间丧心病狂的鄙视链——编程语言篇
    结对编程体会
  • 原文地址:https://www.cnblogs.com/noblex/p/9266043.html
Copyright © 2011-2022 走看看