http://codeforces.com/contest/194/problem/A
这题dp就让我水过过去了,据说可以直接判断,我就不懂得了dp[len][tot] len<=50 tot<=250 还可以水过,表示len门课总分为tot的最优值
http://codeforces.com/contest/194/problem/B
数论水题 , 每次打叉的位置相当于 mod 4*n (n+1)*k = 0 mod(4*n) -> (n+1)*k = k1*4n ,最小解k为 4*n/gcd(n+1,4*n)
http://codeforces.com/contest/194/problem/C
自己SB了,切记每次没有想好就不要去敲,每次已有思路就敲而没有去验证是否正确,导致敲了一半就意思到错了,这样的满足条件的要么无解(sum <=2)要么为1,要么为2只有这几种情况
http://codeforces.com/contest/194/problem/D
这题我想了半天,想到了连续xor 两次是不变的,如果自己实现的好复杂,看的别人的代码,真的很好,实现的很精妙,贴出来吧
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
int a[33];
int b[33];
int k[33];
int p[33];
int n = 0;
int u = 0;
int r = 0;
ll ans = -0x7FFFFFFFFFFFFFFFLL;
int updateAns()
{
ll tans = 0;
for(int i = 1;i <= n;i++) tans += (ll)a[i]*k[i];
if(tans > ans) ans = tans;
return 0;
}
inline int op1()
{
for(int i = 1;i <= n;i++) a[i] ^= b[i];
return 0;
}
inline int op2()
{
int na[33];
for(int i = 1;i <= n;i++) na[i] = a[p[i]]+r;
memcpy(a,na,sizeof(na));
return 0;
}
int dfs(int remain,int last)
{
if((remain&1) == 0) // all op1
{
updateAns();
}
if(!remain) return 0;
int oa[33];
memcpy(oa,a,sizeof(oa));
if(last != 1)
{
op1();
dfs(remain-1,1);
memcpy(a,oa,sizeof(oa));
}
op2();
dfs(remain-1,2);
memcpy(a,oa,sizeof(oa));
return 0;
}
int main(void)
{
scanf("%d %d %d",&n,&u,&r);
for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
for(int i = 1;i <= n;i++) scanf("%d",&b[i]);
for(int i = 1;i <= n;i++) scanf("%d",&k[i]);
for(int i = 1;i <= n;i++) scanf("%d",&p[i]);
dfs(u,-1);
printf("%I64d\n",ans);
//while(getchar() != EOF);
return 0;
}