您的位置:首页 > 其它

Codeforces #191(Div.2)解题报告

2013-07-09 19:54 190 查看
http://codeforces.com/contest/327

  第一次正儿八经写cpp程序啊,没想到写着写着还得查书,看看哪个地方有没有分号啥的,写三目表达式把问号和冒号写反了也查了很长时间。唉,本来以为随便看看书就能转来着。结果第一次写就在比赛写,结果就是我只出了A题,耻辱啊。还有就是半年不碰OI,感觉实现能力还可以,但是调试就完全不行了啊。还有就是一些思路都跟不上了。

A. Flipping Game

  一开始看错题了,以为是要求连续,乱搞扫描弄弄,后来发现理解错题了,干脆写了个O(N^3)暴力。也可以转化为最大连续子序列和DP之。

B. Hungry Sequence

我输出了质数表,没想到有更简单的做法。就是输出一些比较大的递增的数,考虑选择一些适当的第一个数a,使得2*a都比a+n大。也有其他类似的方法。

  留个线性筛模版吧。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: