1. 程式人生 > >[cerc2012]20181018大山中學

[cerc2012]20181018大山中學

 

A

 

題意:n(n<=20)個國家,每個國家之間有一些債務關係,總體為負債的國家會破產,破產國家的債務關係全部消除。問哪些國家可能成為最後一個唯一存在的國家。

題解:

對於每一個狀態,面對若干個負債國,哪個國家先破產會影響最後的結果。

考慮到n<=20,可以狀壓。f[s]表示狀態為s(0表示未破產,1表示已破產)是否存在。

轉移方程:if(!s&(1<<i) && i在s狀態下已破產)  f[s+(1<<i)] | = f[s];

O(2^n * n^2)//很慢www誰有更好的方法請留言

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<queue>
 6 using namespace std;
 7 
 8 const int N=50;
 9 int n,a[N][N],ok[N],f[1100000];
10 
11 int main()
12 {
13     //freopen("a.in","r",stdin);
14     int T;
15     scanf("%d
",&T); 16 while(T--) 17 { 18 scanf("%d",&n); 19 for(int i=0;i<n;i++) 20 for(int j=0;j<n;j++) 21 scanf("%d",&a[i][j]); 22 23 memset(f,0,sizeof(f)); 24 f[0]=1; 25 for(int s=0;s<(1<<n);s++) 26 {
27 if(!f[s]) continue; 28 for(int i=0;i<n;i++) 29 { 30 if(!(s&(1<<i))) 31 { 32 int sum=0; 33 for(int j=0;j<n;j++) 34 if(!(s&(1<<j))) sum-=a[i][j]; 35 if(sum<0) f[s|(1<<i)]=1; 36 } 37 } 38 } 39 memset(ok,0,sizeof(ok)); 40 int bk=0,now=0; 41 for(int i=0;i<n;i++) 42 if(f[((1<<n)-1)-(1<<i)]) ok[i]=1,bk++; 43 for(int i=0;i<n;i++) 44 if(ok[i]) 45 { 46 now++; 47 if(now<bk) printf("%d ",i+1); 48 else printf("%d\n",i+1); 49 } 50 if(!bk) printf("0\n"); 51 } 52 return 0; 53 }

 

B

題意:給定

 

 

 

C

題意:要用元素表裡的元素符號組成字串。

 

題解:

這題的難點在於把元素符號的大寫字母全部改成小寫。。

小dp。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 const int N=500010,M=120;
 9 
10 char p[114][10]={"h","he","li","be","b","c","n","o","f","ne","na","mg","al","si","p","s","cl","ar","k","ca","sc","ti","v","cr","mn","fe","co","ni","cu","zn","ga","ge","as","se","br","kr","rb","sr","y","zr","nb","mo","tc","ru","rh","pd","ag","cd","in","sn","sb","te","i","xe","cs","ba","hf","ta","w","re","os","ir","pt","au","hg","tl","pb","bi","po","at","rn","fr","ra","rf","db","sg","bh","hs","mt","ds","rg","cn","fl","lv","la","ce","pr","nd","pm","sm","eu","gd","tb","dy","ho","er","tm","yb","lu","ac","th","pa","u","np","pu","am","cm","bk","cf","es","fm","md","no","lr"};
11 char s[N];
12 int len[M];
13 bool f[N];
14 
15 int main()
16 {
17     //freopen("a.in","r",stdin);
18     int pl=114;
19     for(int i=0;i<pl;i++) len[i]=strlen(p[i]);
20     int T;
21     scanf("%d",&T);
22     while(T--)
23     {
24         scanf("%s",s+1);
25         int sl=strlen(s+1);
26         memset(f,0,sizeof(f));
27         f[0]=1;
28         for(int i=1;i<=sl;i++)
29         {
30             for(int j=0;j<pl;j++)
31             {
32                 if(len[j]==1)
33                     f[i]=(f[i] || (f[i-1] && s[i]==p[j][0]));
34                 else if(i>=2)
35                     f[i]=(f[i] || (f[i-2] && s[i-1]==p[j][0] && s[i]==p[j][1]));
36             }
37         }
38         if(f[sl]) printf("YES\n");
39         else printf("NO\n");
40     }
41     return 0;
42 }

 

 

 D

給定一個序列,如果序列中存在一個連續子序列,該子序列滿足沒有隻出現一次的數字則boring,否則non-boring