枚举
练的时候以为是dp---(事实上这场只做了10来分钟---就愉快地滚去吃饭了---)


1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 int A,B,C,D,E; 7 int a[15];//汤 8 int b[15];//饭 9 int c[15];//面 10 int d[15];//荤 11 int e[15];//素 12 int minn,maxx; 13 int sum; 14 15 //一荤一素 16 //一荤两素 17 //两荤一素 18 //两荤两素 19 20 void solve(){ 21 int res = 0; 22 23 for(int i = 1;i <= B;i++){ 24 for(int j = 1;j <= A;j++){ 25 sum = 0; 26 27 for(int p = 1;p <= D;p++){ 28 for(int q = 1;q <= E;q++){ 29 sum = b[i] + a[j]; 30 sum += d[p] + e[q]; 31 if(sum >= minn && sum <= maxx) res++; 32 } 33 } 34 35 for(int p=1;p <= D;p++){ 36 for(int q=1;q <= E;q++){ 37 for(int z = q+1;z <= E;z++){ 38 sum = b[i] + a[j]; 39 sum += d[p] + e[q] + e[z]; 40 if(sum >= minn && sum <= maxx) res++; 41 } 42 } 43 } 44 45 46 for(int p=1;p <= D;p++){ 47 for(int q = p+1;q <= D;q++){ 48 for(int z = 1;z <= E;z++){ 49 sum = b[i]+a[j]; 50 sum += d[p] + d[q] + e[z]; 51 if(sum >= minn && sum <= maxx) res++; 52 } 53 } 54 } 55 56 for(int p=1;p <= D;p++){ 57 for(int q = p+1;q <= D;q++){ 58 for(int z = 1;z <= E;z++){ 59 for(int zz = z+1;zz <= E;zz++){ 60 sum = b[i]+a[j]; 61 sum += d[p] + d[q] + e[z] + e[zz]; 62 if(sum >= minn && sum <= maxx) res++; 63 } 64 65 } 66 } 67 } 68 69 70 } 71 } 72 73 for(int i = 1;i <= C;i++){ 74 sum = c[i]; 75 for(int p = 1;p <= D;p++){ 76 for(int q = 1;q <= E;q++){ 77 sum = c[i]; 78 sum += d[p] + e[q]; 79 if(sum >= minn && sum <= maxx) res++; 80 } 81 } 82 83 for(int p=1;p <= D;p++){ 84 for(int q=1;q <= E;q++){ 85 for(int z = q+1;z <= E;z++){ 86 sum = c[i]; 87 sum += d[p] + e[q] + e[z]; 88 if(sum >= minn && sum <= maxx) res++; 89 } 90 } 91 } 92 93 for(int p=1;p <= D;p++){ 94 for(int q = p+1;q <= D;q++){ 95 for(int z = 1;z <= E;z++){ 96 sum = c[i]; 97 sum += d[p] + d[q] + e[z]; 98 if(sum >= minn && sum <= maxx) res++; 99 } 100 } 101 } 102 103 for(int p=1;p <= D;p++){ 104 for(int q = p+1;q <= D;q++){ 105 for(int z = 1;z <= E;z++){ 106 for(int zz = z+1;zz <= E;zz++){ 107 sum = c[i]; 108 sum += d[p] + d[q] + e[z] + e[zz]; 109 if(sum >= minn && sum <= maxx) res++; 110 } 111 112 } 113 } 114 } 115 } 116 printf("%d\n",res); 117 } 118 119 int main(){ 120 int T; 121 scanf("%d",&T); 122 while(T--){ 123 scanf("%d %d %d %d %d",&A,&B,&C,&D,&E); 124 for(int i = 1;i <= A;i++) scanf("%d",&a[i]); 125 for(int i = 1;i <= B;i++) scanf("%d",&b[i]); 126 for(int i = 1;i <= C;i++) scanf("%d",&c[i]); 127 for(int i = 1;i <= D;i++) scanf("%d",&d[i]); 128 for(int i = 1;i <= E;i++) scanf("%d",&e[i]); 129 scanf("%d %d",&minn,&maxx); 130 131 solve(); 132 133 } 134 return 0; 135 }
想到把边权一样的分成一组,然后看选不选---可是不懂选不选的条件---
看题解了--
先把边排序
再把边权相等的看做一组
在这一组里面,如果边的两端属于不同的集合,一定在一棵最小生成树上面
大概是像这篇讲的 http://blog.youkuaiyun.com/crescent__moon/article/details/14189663 贪心的想---


1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 8 const int maxn = 1e5+5; 9 int n,m; 10 int p[maxn]; 11 12 struct Edge{ 13 int u,v,w; 14 }e[maxn]; 15 16 int cmp(Edge e1,Edge e2){ 17 return e1.w < e2.w; 18 } 19 20 int find(int x){ return x == p[x] ? x : p[x] = find(p[x]);} 21 22 void solve(){ 23 for(int i = 1;i <= n;i++) p[i] = i; 24 sort(e+1,e+m+1,cmp); 25 int pos = 0,res = 0; 26 27 for(int i = 1;i <= m;i = pos){ 28 int w = e[i].w; 29 int j; 30 for( j = i;;j++){ 31 if(e[j].w != w) break; 32 int x = find(e[j].u); 33 int y = find(e[j].v); 34 // printf("x = %d y = %d\n",x,y); 35 if(x != y) res++; 36 } 37 pos = j; 38 39 for(int j = i;;j++){ 40 if(j == pos) break; 41 int x = find(e[j].u); 42 int y = find(e[j].v); 43 p[x] = y; 44 } 45 46 } 47 printf("%d\n",res); 48 } 49 50 int main(){ 51 int T; 52 scanf("%d",&T); 53 while(T--){ 54 scanf("%d %d",&n,&m); 55 56 for(int i = 1;i <= m;i++){ 57 scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w); 58 } 59 solve(); 60 } 61 return 0; 62 }
string sort一下
wtw敲的---
还是wtw敲的----
没有编译就交了----
果然这场比赛打得不认真---
模拟
读题不清楚re了好几发---sad---


1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<set> 6 #include<queue> 7 #include<stack> 8 using namespace std; 9 10 stack<int> r;//播放记录 11 int n,m; 12 13 void solve(){ 14 while(!r.empty()) r.pop(); 15 char op[15]; 16 int x; 17 r.push(1); 18 for(int i = 1;i <= m;i++){ 19 scanf("%s",op); 20 if(op[1] == 'R'){ 21 int y = r.top();r.pop(); 22 // printf("y = %d\n",y); 23 if(r.empty()){ 24 puts("1"); 25 r.push(1); 26 } 27 else{ 28 int z = r.top();r.pop(); 29 printf("%d\n",z); 30 if(!r.empty()) { 31 int zz = r.top(); 32 if(z != zz) r.push(z); 33 } 34 else r.push(z); 35 } 36 } 37 if(op[1] == 'E'){ 38 int y = r.top(); 39 if(y < n){ 40 y++; 41 r.push(y); 42 } 43 printf("%d\n",y); 44 45 } 46 if(op[1] == 'L'){ 47 scanf("%d",&x); 48 printf("%d\n",x); 49 50 if(!r.empty()) { 51 int zz = r.top(); 52 if(x != zz) r.push(x); 53 } 54 else r.push(x); 55 } 56 } 57 } 58 59 int main(){ 60 int T; 61 scanf("%d",&T); 62 while(T--){ 63 scanf("%d %d",&n,&m); 64 solve(); 65 } 66 return 0; 67 } 68 69