• Codeforces Round #492 (Div.2 Only)


    似乎这一场ABCDE都是阅读理解题.....

    F最后fst了,一个自己的小bug....难受

    传送门:http://codeforces.com/contest/991

    A题

    直译:

    在一个神奇的科目..你挂科了...

    有A个过了的大佬在"Bug当劳"餐厅庆祝

    B个大佬在"Beaver王"餐厅庆祝

    其中有C个大佬在两个地方都庆祝了

    一共班上有N个人

    给你ABCN问你是否合法

    (PS:你挂科了,所以挂科人数至少为1)

    如果合法,输出有几个挂科的人

    做法:

    A<=C

    B<=C

    N-(A+B-C)>=1

    都满足就输出N-(A+B-C)

    否则输出-1

    B题

    你现在有n个工作,第i个工作拿了ai分(2~5以内的整数)

    你现在可以调整某些分数到5

    问最少调整几个,能让你的平均分在四舍五入以后得到5

    做法:

    sort,然后从低往高排序

    C题

    两个人在分糖吃

    第一个人每次会吃k个,不足全吃了

    第二个人每次会吃剩下的1/10,下取整

    两个人轮流吃,第一个人先

    给你糖的总数n(n<=1018),问最小的k使得第一个人能吃至少一半的糖

    做法:

    二分k

    然后判断就暴力判断,因为每次减少1/10所以很快就能减到底

    D题

    给你一个2*n的格子

    0表示可以放东西,X表示不可以

    问最多能放几个L型的东西(可以旋转L)

    L型的东西具体如下:

    做法:

    直接dp..

    dp(i,j)表示到第i行,上一行有j个空位(j=0,1,2)

    转移方程

    dp(i,0) = max{dp(i-1,0),dp(i-1,1),dp(i-1,2)}

    dp(i,1) = max{dp(i-1,0),dp(i-1,1),dp(i-1,2)+1}

    dp(i,2) = max{dp(i-1,0),dp(i-1,1)+1,dp(i-1,2)+1}

    E题

    你今天上了一辆车,你看到车号是n

    但是你可能昨天赌球输了(大雾)

    你今天看到的数字可能编号顺序会交换,或者把一个数字看了多次

    比如

    12你可能看成112,21,221,12121212,111222121221等

    问你上的车编号到底可能是啥

    编号不可能有前导0,n也没有

    数据范围n<=1018

    做法:

    把数字排序一下,然后枚举这个数用几个,用组合数计算一下

    再减掉首位是0的

    C(n,x0)*C(n-x0,x1)*C(n-x0-x1,x2)*...*C(n-x0-...x8,x9)

    F题

    给你一个数n

    问你可以最少用几个字符表示

    只能用+,*,^和数字

    不允许连续^(也就是说2^3^4是不合法的)

    不允许括号

    做法:

    我们考虑,一共有可能有什么情况

    a+b?

    a*b?似乎只会位数变多,不如n本身

    只有a^b有用

    那么a^b可能会节省很多位,那么就有下面的情况

    a^b+c

    a^b*c

    a^b*c+d

    a^b+c^d

    a^b+c^d*e

    a^b+c^d+e

    差不多就这些情况吧.....

    然后写一下就行...

    代码:

    A

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<math.h>
    #include<time.h>
    #include<vector>
    #include<bitset>
    #include<memory>
    #include<utility>
    #include<fstream>
    #include<stdio.h>
    #include<sstream>
    #include<iostream>
    #include<stdlib.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int main()
    {
        #ifdef absi2011
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        #endif
        int a,b,c,n;
        scanf("%d%d%d%d",&a,&b,&c,&n);
        int ans=n-(a+b-c);
        if ((ans<=0)||(b<c)||(a<c)||(a>n)||(b>n)||(c>n))
        {
            puts("-1");
        }
        else
        {
            printf("%d
    ",ans);
        }
        return 0;
    } 

    B

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<math.h>
    #include<time.h>
    #include<vector>
    #include<bitset>
    #include<memory>
    #include<utility>
    #include<fstream>
    #include<stdio.h>
    #include<sstream>
    #include<iostream>
    #include<stdlib.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int a[105];
    int main()
    {
        #ifdef absi2011
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        #endif
        int n;
        scanf("%d",&n);
        int i;
        int sum=0;
        for (i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            a[i]*=2;
            sum+=a[i];
        }
        sort(a,a+n);
        for (i=0;i<n;i++)
        {
            if (sum>=n*9)
            {
                printf("%d
    ",i);
                return 0;
            }
            sum+=(10-a[i]);
        }
        printf("%d
    ",i);
        return 0;
    }

    C

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<math.h>
    #include<time.h>
    #include<vector>
    #include<bitset>
    #include<memory>
    #include<utility>
    #include<fstream>
    #include<stdio.h>
    #include<sstream>
    #include<iostream>
    #include<stdlib.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    long long check(long long n,long long x)
    {
        if (n<=x) return n;
        n-=x;
        return check(n-n/10,x)+x;
    }
    int main()
    {
        #ifdef absi2011
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        #endif
        long long n;
        cin>>n;
        long long l=1,r=n;
        for (;l<=r;)
        {
            long long mid=(l+r)/2;
            if (check(n,mid)*2>=n)
            {
                r=mid-1;
            }
            else
            {
                l=mid+1;
            }
        }
        cout<<l<<endl;
        return 0;
    }

    D

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<math.h>
    #include<time.h>
    #include<vector>
    #include<bitset>
    #include<memory>
    #include<utility>
    #include<fstream>
    #include<stdio.h>
    #include<sstream>
    #include<iostream>
    #include<stdlib.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    char a[2][105];
    int dp[105][4];
    int main()
    {
        #ifdef absi2011
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        #endif
        scanf("%s%s",a[0],a[1]);
        int n=strlen(a[0]);
        int i;
        dp[0][1]=-10;
        dp[0][2]=-20;
        for (i=0;i<n;i++)
        {
            int now=0;
            if (a[0][i]=='0') now++;
            if (a[1][i]=='0') now++;
            dp[i+1][0]=-10;
            dp[i+1][1]=-10;
            dp[i+1][2]=-10;
            dp[i+1][now]=max(max(dp[i][0],dp[i][1]),dp[i][2]);
            if (now>=1)
            {
                dp[i+1][now-1]=max(max(dp[i][0],dp[i][1]),dp[i][2]+1);
            }
            if (now==2)
            {
                dp[i+1][now-2]=max(max(dp[i][0],dp[i][1]+1),dp[i][2]+1);
            }
        }
        printf("%d
    ",max(dp[n][0],max(dp[n][1],dp[n][2])));
        return 0;
    }

    E

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<math.h>
    #include<time.h>
    #include<vector>
    #include<bitset>
    #include<memory>
    #include<utility>
    #include<fstream>
    #include<stdio.h>
    #include<sstream>
    #include<iostream>
    #include<stdlib.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    char a[25];
    int sum[15];
    int res[15];
    int c[25][25];
    long long ans=0;
    long long calc()
    {
        int sum=0;
        int i;
        for (i=0;i<10;i++)
        {
            sum+=res[i];
        }
        long long p=1;
        for (i=0;i<10;i++)
        {
            p=p*c[sum][res[i]];
            sum-=res[i];
        }
        return p;
    }
    void dfs(int x)
    {
        if (x==10)
        {
            ans+=calc();
            if (sum[0]!=0)
            {
                res[0]--;
                ans-=calc();
                res[0]++;
            }
            return;
        }
        if (sum[x]==0)
        {
            res[x]=0;
            dfs(x+1);
            return;
        }
        int i;
        for (i=1;i<=sum[x];i++)
        {
            res[x]=i;
            dfs(x+1);
        }
    }
    int main()
    {
        #ifdef absi2011
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        #endif
        scanf("%s",a);
        int n=strlen(a);
        int i;
        for (i=0;i<n;i++)
        {
            sum[a[i]-'0']++;
        }
        c[0][0]=1;
        for (i=1;i<=20;i++)
        {
            int j;
            c[i][0]=1;
            for (j=1;j<=20;j++)
            {
                c[i][j]=c[i-1][j-1]+c[i-1][j];
            }
        }
        dfs(0);
        cout<<ans<<endl;
        return 0;
    } 

    F

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<math.h>
    #include<time.h>
    #include<vector>
    #include<bitset>
    #include<memory>
    #include<utility>
    #include<fstream>
    #include<stdio.h>
    #include<sstream>
    #include<iostream>
    #include<stdlib.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    map<long long,int> ma;
    map<long long,string> ma2;
    int calc(long long x)
    {
        int sum=0;
        for (;x!=0;)
        {
            x/=10;
            sum++;
        }
        return sum;
    }
    string get_string(long long x)
    {
        string t="";
        for (;x!=0;)
        {
            t=(char)((x%10)+'0')+t;
            x/=10;
        }
        return t;
    }
    string t[100005];
    int tt[100005];
    map<long long,int> ma3;
    map<long long,string> ma4;
    int get_val(long long x)
    {
        if (ma3.find(x)!=ma3.end()) return ma3[x];
        return calc(x);
    }
    string get_val2(long long x)
    {
        if (ma4.find(x)!=ma4.end()) return ma4[x];
        if (x<=100000) return t[x];
        return get_string(x);
    }
    int main()
    {
        #ifdef absi2011
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        #endif
        int i;
        for (i=1;i<=100000;i++)
        {
            t[i]=get_string(i);
        }
        for (i=1;i<=100000;i++)
        {
            tt[i]=calc(i);
        }
        for (i=2;i<=100000;i++)
        {
            long long p=1;
            int j;
            for (j=1;;j++)
            {
                p*=i;
                if (p>10000000000ll) break;
                if (j==1) continue;
                if (calc(i)+calc(j)+1>=calc(p)) continue;
                if (p>=1000)
                {
                    int ans=1000;
                    if (ma.find(p)!=ma.end())
                    {
                        ans=ma[p];
                    }
                    if (calc(i)+1+calc(j)<ans)
                    {
                        ma[p]=tt[i]+1+tt[j];
                        ma2[p]=t[i]+"^"+t[j];
                    }
                }
            }
        }
        //cout<<ma.size()<<endl;
        //a^b+c
        //a^b*c+d
        //a^b+c^d
        //a^b*c+d^e
        map<long long,int>::iterator ii;
        for (ii=ma.begin();ii!=ma.end();ii++)
        {
            ma3.insert(*ii);
            ma4[(*ii).first]=ma2[(*ii).first];
        }
        for (ii=ma.begin();ii!=ma.end();ii++)
        {
            int i;
            if ((*ii).second>3) continue;
            for (i=1;i<=9;i++)
            {
                int now=(*ii).first+i;
                if (calc(now)<=5) continue;
                ma3[now]=5;
                ma4[now]=ma2[(*ii).first]+"+"+(char)(i+'0');
            }
        }
        long long n;
        cin>>n;
        int min_ans=calc(n);
        string min_string=get_string(n);
        for (ii=ma.begin();ii!=ma.end();ii++)
        {
            if (n<(*ii).first) break;
            long long t=n-(*ii).first;
            int val;
            if (ma3.find(t)==ma3.end())
            {
                if (t>=1000000) continue;
            }
            else
            {
                if (ma3[t]>=6) continue;
            }
            string val2;
            if (n==(*ii).first)
            {
                val=(*ii).second;
                val2=ma2[(*ii).first];
            }
            else
            {
                val=(*ii).second+1+get_val(n-(*ii).first);
                val2=ma2[(*ii).first]+"+"+get_val2(n-(*ii).first);
            }
            if (val<min_ans)
            {
                min_ans=val;
                min_string=val2;
            }
        }
        for (ii=ma.begin();ii!=ma.end();ii++)
        {
            if (n<(*ii).first) break;
            int t=n/(*ii).first;
            if (t==1) continue;
            if (t>=100000) continue;
            long long p=n%(*ii).first;
            if (((ma.find(p)!=ma.end())&&(ma[p]<=3))||(p<1000))
            {
                int val;
                string val2;
                if (p==0)
                {
                    val=(*ii).second+1+get_val(t);
                    if (val>=min_ans) continue;
                    val2=ma2[(*ii).first]+"*"+get_val2(t);
                }
                else
                {
                    val=(*ii).second+1+get_val(t)+1+get_val(p);
                    if (val>=min_ans) continue;
                    val2=ma2[(*ii).first]+"*"+get_val2(t)+"+"+get_val2(p);
                }
                if (val<min_ans)
                {
                    min_ans=val;
                    min_string=val2;
                }
            }
        }
        cout<<min_string<<endl;
        return 0;
    } 
  • 相关阅读:
    Django model中的内嵌类(Class Meta)
    drf框架(二)
    drf框架(一)
    html、CSS 简单回顾
    前端vue框架(五)
    前端vue框架(四)
    前端Vue框架(三)
    前端vue框架(二)
    前端开发Vue框架(二)
    mysql 比较两个日期的时间差
  • 原文地址:https://www.cnblogs.com/absi2011/p/9221767.html
Copyright © 2020-2023  润新知