似乎这一场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\n",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\n",i);
return 0;
}
sum+=(10-a[i]);
}
printf("%d\n",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\n",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;
}
浙公网安备 33010602011771号