<a target=_blank href="http://codeforces.com/contest/451/problem/A" target="_blank">A. Game With Sticks</a>
<span style="font-family: Arial, Helvetica, sans-serif;">n个水平棍子,m个竖直棍,组成网格,每次删除交点所在的行和列,两个人轮流删除,直到最后没有交点为止,最后不能再删除的人将输掉</span>
</pre><pre name="code" class="cpp">取哪个点没有区别
脑残加了个n=m=1的特判还是错的卡到46minWA2发。。。
scanf("%d%d",&n,&m);
if( min(m,n)%2==1 )
cout<<"Akshat";
else
cout<<"Malvika";
B. Sort the Array
按a[i]的值排序然后
(感谢易)
bool can(){
bool need = false;
for (int j = 1; j <=n; j ++){
if (a[j].id!=j){
need =true;
break;
}
}
if (!need){
cout<<"yes"<<endl;
cout<<"1 1"<<endl;
return true;
}
int i;
for (i = n; i >0; i --)
if (a[i].id!=i) break;
int l,r;
r = i; l = a[i].id;
for (int j =l;j <=r; j ++){
if (j-l!=r-a[j].id){
return false;
}
}
for (int j = 1; j <l; j ++)
if (a[j].id!=j) return false;
cout<<"yes"<<endl;
cout<<l<<" "<<r<<endl;
return true;
}
C. Predict Outcome of the Game
n场球,已经踢了K场,知道三个队a,b,c,的胜场差是|a-b|=d1,|b-c|=d2
求是否有希望踢完三队胜场相同
根据a,b,c大小关系分四种情况考虑
if(n%3!=0)
{
printf("no\n");continue;
}
if(k+d2+2*d1>=0 && (k+(d2+2*d1))%3==0 )
{
a=(k+d2+2*d1)/3;
b=a-d1;
c=b-d2;
if(a<=n/3 &&b<=n/3 &&c<=n/3 &&a>=0 &&b>=0 &&c>=0)
ans=true;
}
if(k+d2-2*d1>=0 && (k+(d2-2*d1))%3==0 )
{
a=(k+d2-2*d1)/3;
b=a+d1;
c=b-d2;
if(a<=n/3 &&b<=n/3 &&c<=n/3 &&a>=0 &&b>=0 &&c>=0)
ans=true;
}
if(k-d2+2*d1>=0 && (k-d2+2*d1)%3==0 )
{
a=(k-d2+2*d1)/3;
b=a-d1;
c=b+d2;
if(a<=n/3 &&b<=n/3 &&c<=n/3 &&a>=0 &&b>=0 &&c>=0)
ans=true;
}
if(k-d2-2*d1>=0 && (k-d2-2*d1)%3==0 )
{
a=(k-d2-2*d1)/3;
b=a+d1;
c=b+d2;
if(a<=n/3 &&b<=n/3 &&c<=n/3 &&a>=0 &&b>=0 &&c>=0)
ans=true;
}
if(ans) printf("yes\n");
else printf("no\n");
}
给出一个字符串,该字符串的子串中,长度为奇数的good string有多少个,长度为偶数的good string(字符串中连续相同的字符合并为一个字符,形成回文串的字符串)有多少个。
看官方题解是这样:
扫一遍S,统计S中到当前位置之前 奇数位和偶数位a,b分别出现次数
第一问:在偶数位时 当前位置字母出现在奇数位次数 + 在奇数位时 当前位置字母出现在偶数位次数
第二问:在偶数位时 当前位置字母出现在偶数位次数 + 在奇数位时 当前位置字母出现在奇数位次数
(奇偶从0开始算)
代码直接去standing找吧(因为我也没看懂为嘛题解这个是对的。。。)
有n个花坛,每个花坛有f[i]支花。同一个花坛的花颜色相同,不同花坛的花颜色不同,问取s朵花一共有多少种取法
如果每一个每一种花都有无限个(即>=s),很明显,有C(s+n-1,n-1)种取法。
如果某种花不够,那么就有C(s+n-1-x-1,n-1)种取法要减去。
代码是男的另一种直接加,类似官方题解的方法(我还是不会这个)
Calc为乘法逆元求组合数模 模版
LL ret = 0;
for ( int i = 0; i < (1 << n); i ++ ) {
LL sum = 0, num = 0;
for ( int j = 0; j < n; j ++ )
if ( (1 << j) & i ) {
sum += x[j];
num ++;
}
sum += num;
if ( sum <= s ) {
ret += (( num & 1LL ) ? -1LL : 1LL ) * Calc( s - sum + n - 1, n - 1 );
ret %= mod;
}
}
ret = ( ret + mod ) % mod;
cout <<ret<<endl;