题目背景
pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv
命运偷走如果只留下结果, 时间偷走初衷只留下了苦衷。
你来过,然后你走后,只留下星空。
题目描述
逃不掉的那一天还是来了,小 F 看着夜空发呆。
天上空荡荡的,没有一颗星星——大概是因为天上吹不散的乌云吧。
心里吹不散的乌云,就让它在那里吧,反正也没有机会去改变什么了。
小 C 拿来了一长串星型小灯泡,假装是星星,递给小 F,想让小 F 开心一点。不过,有 着强迫症的小 F 发现,这串一共 n 个灯泡的灯泡串上有 k 个灯泡没有被点亮。小 F 决定 和小 C 一起把这个灯泡串全部点亮。
不过,也许是因为过于笨拙,小 F 只能将其中连续一段的灯泡状态给翻转——点亮暗灯 泡,熄灭亮灯泡。经过摸索,小 F 发现他一共能够翻转 m 种长度的灯泡段中灯泡的状态。
小 C 和小 F 最终花了很长很长很长很长很长很长的时间把所有灯泡给全部点亮了。他 们想知道他们是不是蠢了,因此他们找到了你,让你帮忙算算:在最优的情况下,至少需要 几次操作才能把整个灯泡串给点亮?
输入输出格式
输入格式:
从标准输入中读入数据。
输入第 1 行三个正整数 n,k,m。
输入第 2 行 kk 个正整数,第 i 个数表示第 i 个被没点亮的灯泡的位置 a_iai。
输入第 3 行 mm 个正整数,第 i 个数表示第 i 种操作的长度 b_ibi。
保证所有 b_ibi 互不相同;保证对于 1 \le i < k1≤i<k,有 a_i< a_i+1ai<ai+1;保证输入数据有解。
输出格式:
输出标准输入中。
输出一行一个非负整数,表示最少操作次数。
输入输出样例
说明
【样例 1 解释】
【数据范围与约定】
子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解 决一部分测试数据。
每个测试点的数据规模及特点如下表
特殊性质:保证答案小于 4
不妨就暴力一点吧。。。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<map> 7 #include<set> 8 #include<queue> 9 #include<vector> 10 #define INF 0x7f7f7f7f 11 #define pii pair<int,int> 12 #define ll long long 13 #define MOD 19260817 14 using namespace std; 15 int read(){ 16 int x=0,f=1;char ch=getchar(); 17 while(ch<'0'||ch>'9'){if('-'==ch)f=-1;ch=getchar();} 18 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 19 return x*f; 20 } 21 struct Node{ 22 int cost; 23 int sum; 24 int a[205]; 25 Node(int p1=0,int p2=0,int b[205]={0}){ 26 cost=p1; 27 sum=p2; 28 memcpy(a,b,sizeof(a)); 29 } 30 }; 31 ll hash(Node t){ 32 ll ret=1; 33 for(int i=1;i<=200;i++){ 34 ret=((ret<<1)+t.a[i])%MOD; 35 } 36 return ret; 37 } 38 set<ll> s; 39 int n,k,m; 40 int L[65]; 41 queue<Node> q; 42 void init(){ 43 n=read(),k=read(),m=read(); 44 int t[205]={0}; 45 for(int i=1;i<=k;i++){ 46 t[read()]=1; 47 } 48 for(int i=1;i<=m;i++){ 49 L[i]=read(); 50 } 51 q.push(Node(0,k,t)); 52 s.insert(hash(Node(0,k,t))); 53 } 54 void solve(){ 55 while(!q.empty()){ 56 int a[205]={0}; 57 int cost=q.front().cost; 58 int sum=q.front().sum; 59 memcpy(a,q.front().a,sizeof(a)); 60 q.pop(); 61 for(int i=1;i<=m;i++){ 62 for(int j=1;j<=n-L[i]+1;j++){ 63 int b[205]={0},dsum=sum; 64 memcpy(b,a,sizeof(b)); 65 for(int l=j;l<=j+L[i]-1;l++){ 66 if(!b[l]){ 67 dsum++; 68 } 69 else{ 70 dsum--; 71 } 72 b[l]=(!b[l]); 73 } 74 if(!dsum){ 75 printf("%d\n",cost+1); 76 return; 77 } 78 Node t=Node(cost+1,dsum,b); 79 ll h=hash(t); 80 if(s.count(h)){ 81 continue; 82 } 83 q.push(t); 84 s.insert(h); 85 } 86 } 87 } 88 } 89 int main() 90 { 91 // freopen("starlit2.in","r",stdin); 92 init(); 93 solve(); 94 return 0; 95 }