http://codeforces.com/contest/327
第一次正儿八经写cpp程序啊,没想到写着写着还得查书,看看哪个地方有没有分号啥的,写三目表达式把问号和冒号写反了也查了很长时间。唉,本来以为随便看看书就能转来着。结果第一次写就在比赛写,结果就是我只出了A题,耻辱啊。还有就是半年不碰OI,感觉实现能力还可以,但是调试就完全不行了啊。还有就是一些思路都跟不上了。
A. Flipping Game
一开始看错题了,以为是要求连续,乱搞扫描弄弄,后来发现理解错题了,干脆写了个O(N^3)暴力。也可以转化为最大连续子序列和DP之。
B. Hungry Sequence
我输出了质数表,没想到有更简单的做法。就是输出一些比较大的递增的数,考虑选择一些适当的第一个数a,使得2*a都比a+n大。也有其他类似的方法。
留个线性筛模版吧。
Code#include <iostream> #include <cstring> #define ull (unsigned long long) using namespace std; int main() { long int n,maxn=100,prime[100],num=0; bool v[maxn];cin>>n; memset(v,0,(maxn+1)*sizeof(v[0])); for(int i=2;i<=maxn;i++){ if(num>=n)break; if(!v[i])prime[num++]=i; for(int j=0;(j<num)&&(ull i*prime[j]<=maxn);j++){ v[i*prime[j]]=1;if(!(i%prime[j])) break; } } for(int i=0;i<n;i++) cout<<prime[i]<<' '; cout<<endl; }
C.Magic five
搞成等比数列求和再用个费马小定理。留个快速幂模版。
这题的关键在于我写坑了很多地方,各种调试。
1.输入写坑了
2.快速幂有个地方把乘写成加
3.a1,q爆long long,因为忘记取模
4.a1加取模以后,三目表达式哪里少些一对括号变成q:0+a1调了好久
还是要仔细一点啊。
Code#include <iostream> #include <cstdio> #define ll long long const long int MO=1000000007; using namespace std; ll pow(ll a,ll b) { ll res=1; while(b){ res=(((b & 1)?a:1)*res)%MO; b>>=1;a=(a*a)%MO; } return res; } int main() { ll a1=0,q=1,m=0,t,n; for(m=0;(t=getchar())!='\n';q=(q<<1)%MO,m++) a1=(((((char)t=='0')or((char)t=='5'))?q:0)+a1)%MO; cin>>n; ll ans=(((a1*(pow(q,n)-1))%MO)*pow(q-1,MO-2))%MO; cout<<ans<<endl; return 0; }
D.Block Tower
floodfill边建边拆,注意读题。我觉得BFS出来,把队列里头东西搞搞输出来也对,而且比DFS好写,但是没写。代码不贴了。
E.Axis Walking
按说这个复杂度应该能过啊。但是第七个点超时了。不想写了。
Code#include <iostream> #include <cstring> #include <cstdio> #define lowbit(x) ((x)&(-(x))) #define ll long int using namespace std; const ll MO=1000000007; const int MAXN=24; int calc(int x) {int i;for(i=0;x>0;i++)x>>=1;return i-1;} int main() { ll sum[1<<MAXN]={0},f[1<<MAXN]={0}; int n,a[24],k,d[2]; cin>>n;for(int i=0;i<n;i++)cin>>a[i]; cin>>k;for(int i=0;i<k;i++)cin>>d[i]; for(int i=0;i<n;i++)f[1<<i]=1; for(int i=1;i<(1<<n);i++){ sum[i]=sum[i^lowbit(i)]+a[calc(lowbit(i))]; for(int j=0;j<k;j++)if(sum[i]==d[j])f[i]=-1; if(f[i]<0){f[i]=0;continue;} for(int j=0;j<n;j++) f[i]=(f[i]+((i&(1<<j))?f[i^(1<<j)]:0))%MO; } cout<<f[(1<<n)-1]<<endl; return 0; }