UESTC 2016 Summer Training #10 Div.2(未完待续)
2016-07-21 19:25
357 查看
题目来源:2008-2009 ACM-ICPC East Central North America Regional Contest (ECNA 2008)
http://codeforces.com/gym/100646
D
题意:给你N场宴会的开始和结束时间,都是整点,在一个小时内,你最多只能参加2场宴会,问你最多能去到多少宴会。
两种方法:
1)比赛中我比较智障,是用二分图最大匹配做的。
宴会时间是8-24,每小时至多两场,那我就对应到16-48,每点对应一个宴会,最多100个点,能去就连边,跑一个二分图最大匹配
还有一种方法就是贪心
对右端点排序,相同的话则把左端点大的放在前面,让受到限制最大的点先选就可以了,貌似大多数人都是这么做出来的(我就说怎么大家都会二分图,很强)
E
题意:就是数独游戏,给你一个9 * 9的格子,其中每个3 * 3的格子里都含有1—9共9个数,并且每行每列也都是含有1—9共9个数,每次给你一个这样的格子,有5个格子变成0,其他给你。问你能否把它恢复成一个正确的9 * 9的格子。
解法:由于只有5个格子位置,于是直接暴力枚举每个格子是1-9的情况,对于每种枚举,check一下是否合法,合法就直接输出即可。
http://codeforces.com/gym/100646
D
题意:给你N场宴会的开始和结束时间,都是整点,在一个小时内,你最多只能参加2场宴会,问你最多能去到多少宴会。
两种方法:
1)比赛中我比较智障,是用二分图最大匹配做的。
宴会时间是8-24,每小时至多两场,那我就对应到16-48,每点对应一个宴会,最多100个点,能去就连边,跑一个二分图最大匹配
#include <bits/stdc++.h> #define _ ios_base::sync_with_stdio(0);cin.tie(0); #define INF 0x3f3f3f3f #define eps 1e-6 typedef long long LL; const double pi = acos(-1.0); const long long mod = 1e9 + 7; using namespace std; int q[105][105]; int used[105]; int girl[105]; struct data { int x,y; }p[105]; bool cmp(const data a,const data b) { if(a.x == b.x) return a.y < b.y; return a.x < b.x; } bool fun(int x) { for(int j = 16;j < 48;j++) { if(q[x][j] == 1 && used[j] == 0) { used[j] = 1; if(girl[j] == -1 || fun(girl[j])) { girl[j] = x; return 1; } } } return 0; } int main() { //ios_base::sync_with_stdio(false); cin.tie(0); //freopen("int.txt","r",stdin); //freopen("out.txt","w",stdout); int N; int cas = 1; while(scanf("%d",&N) == 1 && N != 0) { int ans = 0; for(int i = 0;i < N;i++) scanf("%d %d",&p[i].x,&p[i].y); sort(p,p + N,cmp); memset(q,0,sizeof(q)); memset(girl,-1,sizeof(girl)); for(int i = 0;i < N;i++) for(int j = 2 * p[i].x;j < 2 * p[i].y;j++) q[i][j] = 1; for(int i = 0;i < N;i++) { memset(used,0,sizeof(used)); if(fun(i)) ans++; } printf("On day %d Emma can attend as many as %d parties.\n",cas++,ans); } return 0; }
还有一种方法就是贪心
对右端点排序,相同的话则把左端点大的放在前面,让受到限制最大的点先选就可以了,貌似大多数人都是这么做出来的(我就说怎么大家都会二分图,很强)
#include <bits/stdc++.h> #define INF 0x3f3f3f3f #define eps 1e-6 typedef long long LL; const double pi = acos(-1.0); const long long mod = 1e9 + 7; using namespace std; struct data { int x,y; }p[10005]; bool cmp(const data a,const data b) { if(a.y == b.y) return a.x > b.x; return a.y < b.y; } int vis[10005]; int main() { int N; int cas = 1; while(cin >> N) { if(N == 0) break; memset(vis,0,sizeof(vis)); for(int i = 0;i < N;i++) { scanf("%d %d",&p[i].x,&p[i].y); p[i].x *= 2; p[i].y *= 2; } sort(p,p + N,cmp); int ans = 0; memset(vis,0,sizeof(vis)); for(int i = 0;i < N;i++) for(int j = p[i].x;j < p[i].y;j++) if(!vis[j]){ vis[j] = 1; ans++; break; } printf("On day %d Emma can attend as many as %d parties.\n",cas++,ans); } return 0; }
E
题意:就是数独游戏,给你一个9 * 9的格子,其中每个3 * 3的格子里都含有1—9共9个数,并且每行每列也都是含有1—9共9个数,每次给你一个这样的格子,有5个格子变成0,其他给你。问你能否把它恢复成一个正确的9 * 9的格子。
解法:由于只有5个格子位置,于是直接暴力枚举每个格子是1-9的情况,对于每种枚举,check一下是否合法,合法就直接输出即可。
#include <bits/stdc++.h> #define _ ios_base::sync_with_stdio(0);cin.tie(0); #define INF 0x3f3f3f3f #define eps 1e-6 typedef long long LL; const double pi = acos(-1.0); const long long mod = 1e9 + 7; using namespace std; char s[10][10]; int a[15]; struct data { int x,y; }p[10]; int check() { for(int i = 0;i < 9;i++) { memset(a,0,sizeof(a)); for(int j = 0;j < 9;j++) a[s[i][j] - '0']++; for(int j = 1;j <= 9;j++) if(a[j] == 0) return 0; } for(int i = 0;i < 9;i++) { memset(a,0,sizeof(a)); for(int j = 0;j < 9;j++) a[s[j][i] - '0']++; for(int j = 1;j <= 9;j++) if(a[j] == 0) return 0; } for(int i = 0;i < 9;i += 3) for(int j = 0;j < 9;j += 3) { memset(a,0,sizeof(a)); for(int k = 0;k < 3;k++) for(int l = 0;l < 3;l++) a[s[i + k][j + l] - '0']++; for(int i = 1;i <= 9;i++) if(a[i] == 0) return 0; } return 1; } int main() { //ios_base::sync_with_stdio(false); cin.tie(0); //freopen("int.txt","r",stdin); //freopen("out.txt","w",stdout); int T; cin >> T; int first = 1; while(T--) { int ok = 0; int m = 0; for(int i = 0;i < 9;i++) scanf("%s",s[i]); for(int i = 0;i < 9;i++) for(int j = 0;j < 9;j++) if(s[i][j] == '0'){ p[m].x = i; p[m++].y = j; } int ansi = 0,ansj = 0,ansk = 0,ansl = 0,ansn = 0; for(int i = 1;i < 10;i++) for(int j = 1;j < 10;j++) for(int k = 1;k < 10;k++) for(int l = 1;l < 10;l++) for(int n = 1;n < 10;n++){ s[p[0].x][p[0].y] = i + '0'; s[p[1].x][p[1].y] = j + '0'; s[p[2].x][p[2].y] = k + '0'; s[p[3].x][p[3].y] = l + '0'; s[p[4].x][p[4].y] = n + '0'; if(check() == 1) { ok = 1; ansi = i; ansj = j; ansk = k; ansl = l; ansn = n; } } s[p[0].x][p[0].y] = ansi + '0'; s[p[1].x][p[1].y] = ansj + '0'; s[p[2].x][p[2].y] = ansk + '0'; s[p[3].x][p[3].y] = ansl + '0'; s[p[4].x][p[4].y] = ansn + '0'; if(first) first = 0; else puts(""); if(ok) { for(int i = 0;i < 9;i++) printf("%s\n",s[i]); } else puts("Could not complete this grid."); } return 0; }
相关文章推荐
- vue.js组件化开发实践
- UITableView 横向滚动(一)
- 1085. Perfect Sequence (25)-PAT甲级真题
- POJ 3368 Frequent values 线段树 || RMQ
- UVA - 133 The Dole Queue
- 1101. Quick Sort (25)-PAT甲级真题
- Android更新UI的方式
- UICollectionView的基本概念与使用
- UIViewController Class Reference
- 提升我们的UI Perfermance
- 部署安装Mirantis OpenStack Fuel 9.0
- HDU 3415-Max Sum of Max-K-sub-sequence 单调队列
- iOS 如何获取应用当前的控制器 UIWindow & UIWindowLevel笔记
- NGUI根据图片是否透明来决定是否可以点中
- 【最长下降子序列】【动态规划】【二分】XMU 1041 Sequence
- 百度UEditor编辑器使用教程与使用方法
- Leetcode 225. Implement Stack using Queues (Easy) (cpp)
- 【杭电oj】2152 - Fruit(母函数)
- Android开发,建立具有键值对(key-value)关系的spinner
- 隐藏title,requestWindowFeature(Window.FEATURE_NO_TITLE);失效