2016 第七届福建省大学生程序设计竞赛
2017-07-19 11:30
501 查看
A.
B.
C.
题意:两人轮流玩卡片,共n*2张,每次随机抽一张,比较大小,赢了的话加一分胜点,求Fat brother的期望胜点。
思路:两人获胜的期望是相等的,所以直接n/2就是结果了
D.
题意:两人轮流玩卡片,每人n张,每次随机抽一张,比较大小,赢了的话加一分胜点,求Fat brother的期望胜点。
思路:排序后,每次二分找位置就行了
E.
题意:两人轮流玩卡片,每人n张,按照栈的特性放置,每次按顺序抽一张,比较大小,赢了的话加一分胜点,求Fat brother的期望胜点。
思路:直接挨个比大小就行了。
F.
G.
题意:你有长度为n的金子,要将其分成若干块(整数),使得小于等于n的所有长度都能凑够(不找零)
思路:
1 2 4 8 16这种的数可以将所有的数覆盖,这个又分别对应数的二进制,所以直接看n的二进制位数就是结果了。
H.
I.
J.
题意:让你在保证原有各点联通的情况下,求至多可以去掉的边数
思路:100点数,明显floyd。
如果有重边,肯定要去掉;
如果原来直接相连,floyd可以松弛掉,原来的边去掉。
开始以为可以直接用真值floyd,石乐志
B.
C.
题意:两人轮流玩卡片,共n*2张,每次随机抽一张,比较大小,赢了的话加一分胜点,求Fat brother的期望胜点。
思路:两人获胜的期望是相等的,所以直接n/2就是结果了
#include<iostream> #include<cstdio> using namespace std; const int N = 2e4+5; int a ; int main() { int t,n; cin >> t; for(int ca = 1;ca <= t;ca++) { scanf("%d",&n); for(int i = 0;i < n*2;i++) scanf("%d",&a[i]); printf("Case %d: %.2f\n",ca,0.5*n); } return 0; }
D.
题意:两人轮流玩卡片,每人n张,每次随机抽一张,比较大小,赢了的话加一分胜点,求Fat brother的期望胜点。
思路:排序后,每次二分找位置就行了
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N = 2e4+5; int a ,b ; int main() { int t,n; cin >> t; for(int ca = 1;ca <= t;ca++) { scanf("%d",&n); for(int i = 0;i < n;i++) scanf("%d",&a[i]); for(int i = 0;i < n;i++) scanf("%d",&b[i]); printf("Case %d: ",ca); sort(a,a+n); sort(b,b+n); double ans = 0; for(int i = 0;i < n;i++) ans += lower_bound(b,b+n,a[i])-b; printf("%.2f\n",ans/n); } return 0; }
E.
题意:两人轮流玩卡片,每人n张,按照栈的特性放置,每次按顺序抽一张,比较大小,赢了的话加一分胜点,求Fat brother的期望胜点。
思路:直接挨个比大小就行了。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N = 2e4+5; int a ,b ; int main() { int t,n; cin >> t; for(int ca = 1;ca <= t;ca++) { scanf("%d",&n); for(int i = 0;i < n;i++) scanf("%d",&a[i]); for(int i = 0;i < n;i++) scanf("%d",&b[i]); printf("Case %d: ",ca); int ans = 0; for(int i = 0;i < n;i++) if(a[i] + b[i] > 10) ans++; printf("%d\n",ans); } return 0; }
F.
G.
题意:你有长度为n的金子,要将其分成若干块(整数),使得小于等于n的所有长度都能凑够(不找零)
思路:
1 2 4 8 16这种的数可以将所有的数覆盖,这个又分别对应数的二进制,所以直接看n的二进制位数就是结果了。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int main() { int t,n; cin >> t; for(int ca = 1;ca <= t;ca++) { scanf("%d",&n); printf("Case %d: ",ca); int ans = 0; while(n > 0) { ans++; n >>= 1; } printf("%d\n",ans); } return 0; } //1 2 4 8 16
H.
I.
J.
题意:让你在保证原有各点联通的情况下,求至多可以去掉的边数
思路:100点数,明显floyd。
如果有重边,肯定要去掉;
如果原来直接相连,floyd可以松弛掉,原来的边去掉。
开始以为可以直接用真值floyd,石乐志
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int INF = 0x3f3f3f3f; int d[105][105]; bool vis[105][105],v[105][105]; void floyd(int n) { for(int k = 1;k <= n;k++) for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++) if(d[i][j] >= d[i][k] + d[k][j]) { d[i][j] = d[i][k] + d[k][j]; vis[i][j] = true; } } int main() { int t,n,m; cin >> t; for(int ca = 1;ca <= t;ca++) { int ans = 0; memset(v,false,sizeof(v)); memset(vis,false,sizeof(vis)); memset(d,0x3f,sizeof(d)); scanf("%d%d",&n,&m); int x,y,s; while(m--) { scanf("%d%d%d",&x,&y,&s); v[x][y] = v[y][x] = true; if(d[x][y] < INF) ans++; d[x][y] = d[y][x] = min(d[x][y],s); } floyd(n); printf("Case %d: ",ca); for(int i = 1;i <= n;i++) for(int j = i+1;j <= n;j++) if(v[i][j] && vis[i][j]) ans++; printf("%d\n",ans); } return 0; }
相关文章推荐
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU2271 X(最短路,Folyd变形)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU2268 Cutting Game(数学,规律)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU2264,2265,2266 Card Game 系列 (数学,规律)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- 第七届福建省大学生程序设计竞赛 Problem J- X(floyd)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- 福建省第七届大学生程序设计竞赛 ---- 赛后总结
- (最短路)第七届福建省大学生程序设计竞赛 Problem J- X
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)