[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

猜你喜欢

转载自www.cnblogs.com/KonjakJuruo/p/9809493.html