[cerc2012]20181018大山中學
阿新 • • 發佈:2018-11-11
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