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;
} 
原文地址:https://www.cnblogs.com/absi2011/p/9221767.html