2015.10.20 福州大学第九届程序设计竞赛

本文精选了解答FZU在线评测系统的几道题目,包括通过枚举解决的餐厅点餐问题、利用贪心算法进行的树边统计、最长队名字符串排序问题以及模拟播放器操作的实现等。每道题目都附上了详细的代码实现。

FZU 2086 餐厅点餐

枚举

练的时候以为是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 } 
View Code

 

FZU 2087 统计树边

想到把边权一样的分成一组,然后看选不选---可是不懂选不选的条件---

看题解了--

先把边排序

再把边权相等的看做一组

在这一组里面,如果边的两端属于不同的集合,一定在一棵最小生成树上面

大概是像这篇讲的 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 }
View Code

 

 

FZU 2088 最长队名

string sort一下

wtw敲的---

 

FZU 2089 数字游戏

还是wtw敲的----

没有编译就交了----

果然这场比赛打得不认真---

FZU 2090 旅行社的烦恼

 

FZU 2091 播放器

模拟

读题不清楚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  
View Code

 

 

FZU 2092 收集水晶

 

FZU 2093 寻找兔子

 

转载于:https://www.cnblogs.com/wuyuewoniu/p/4899679.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值