Problem A Playing with Dice
题意:两个人心中都想一个数字,然后掷骰子。骰子1-6问你有几种方案会靠近a想的数字几种一样近几种靠近b的?
思路:大水题一枚直接1-6枚举。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <cstdlib> 6 #include <algorithm> 7 #include <utility> 8 #include <queue> 9 #include <stack> 10 #include <vector> 11 #define MP(a, b) make_pair(a, b) 12 #define PB(a) push_back(a) 13 14 using namespace std; 15 16 typedef long long ll; 17 typedef pair<int,int> pii; 18 19 const int INF = 0x3f3f3f3f; 20 const double eps = 1E-6; 21 22 int main() 23 { 24 // freopen("in.txt", "r", stdin); 25 int a, b; 26 27 while(scanf("%d%d", &a, &b)!=EOF){ 28 int x = 0, y = 0, z = 0; 29 for(int i=1; i<=6; i++){ 30 if(abs(i-a)==abs(i-b))y++; 31 else if(abs(i-a)>=abs(i-b))x++; 32 else z++; 33 } 34 cout << z << ' ' << y << ' ' << x << endl; 35 } 36 return 0; 37 }
Problem B Semifinals
题意:有一些人比赛,晋级规则是有一个k,首先两场比赛的前k名晋级或者是全部选手排名前2k的晋级。
思路:这道题我是分了两个数组存,一个是一维的一个是二维的。首先标记二维的前n/2个,再标记一位数组排好序后的前n个。最后输出矩阵即可。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <cstdlib> 6 #include <algorithm> 7 #include <utility> 8 #include <queue> 9 #include <stack> 10 #include <vector> 11 #define MP(a, b) make_pair(a, b) 12 #define PB(a) push_back(a) 13 14 using namespace std; 15 16 typedef long long ll; 17 typedef pair<int,int> pii; 18 19 const int INF = 0x3f3f3f3f; 20 const double eps = 1E-6; 21 const int LEN = 100011; 22 int Map[LEN][2], ans[LEN][2], ss[LEN*2]; 23 24 bool cmp(int a, int b){return a>b;} 25 26 int main() 27 { 28 // freopen("in.txt", "r", stdin); 29 int n; 30 while(scanf("%d", &n)!=EOF){ 31 memset(ans, 0, sizeof ans); 32 for(int i=0; i<n; i++){ 33 scanf("%d%d", &Map[i][0], &Map[i][1]); 34 ss[2*i] = Map[i][0]; 35 ss[2*i+1] = Map[i][1]; 36 } 37 sort(ss, ss+2*n); 38 for(int i=0; i<n; i++){ 39 for(int j=0; j<2; j++){ 40 if(i<n/2 || Map[i][j]<=ss[n-1])ans[i][j] = 1; 41 } 42 } 43 for(int j=0; j<2; j++){ 44 for(int i=0; i<n; i++){ 45 printf("%d", ans[i][j]); 46 } 47 printf(" "); 48 } 49 50 } 51 return 0; 52 }
Problem C Maze
题意:一张图中有一个连通分支有s个点。然后现在允许你赌上k个结点,然后要是剩下的结点还在一个联通分支下。
思路:直接搜索当标记结点等于s-k个时退出(这是标记的点正好形成一个联通分支)然后剩下来的点就是需要填上的点。当然一开始需要先统计一下,图中连通分支的结点数。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <cstdlib> 6 #include <algorithm> 7 #include <utility> 8 #include <queue> 9 #include <stack> 10 #include <vector> 11 #define MP(a, b) make_pair(a, b) 12 #define PB(a) push_back(a) 13 14 using namespace std; 15 16 typedef long long ll; 17 typedef pair<int,int> pii; 18 19 const int INF = 0x3f3f3f3f; 20 const double eps = 1E-6; 21 const int LEN = 1010; 22 int n ,m, K, vis[LEN][LEN] ,cnt , S; 23 char Map[LEN][LEN]; 24 int xx[] = {0, 0, 1,-1}; 25 int yy[] = {1,-1, 0, 0}; 26 typedef struct { 27 int x,y; 28 }P; 29 30 31 void bfs(P s){ 32 queue<P> q; 33 q.push(s); 34 vis[s.x][s.y] = 1; 35 if(cnt>=S-K)return; 36 while(!q.empty()){ 37 P vex = q.front(); q.pop(); 38 for(int i=0; i<4; i++){ 39 P nv; 40 nv.x = vex.x+xx[i]; 41 nv.y = vex.y+yy[i]; 42 if(nv.x>=0 && nv.x<n && nv.y>=0 && nv.y<m && Map[nv.x][nv.y]!='#' && !vis[nv.x][nv.y]){ 43 vis[nv.x][nv.y] = 1; 44 cnt++; 45 if(cnt>=S-K)return; 46 q.push(nv); 47 } 48 } 49 } 50 } 51 52 53 int main() 54 { 55 // freopen("in.txt", "r", stdin); 56 57 P s; 58 while(scanf("%d%d%d", &n, &m, &K)!=EOF){ 59 for(int i=0; i<n; i++){ 60 scanf("%s", Map[i]); 61 } 62 S = 0; 63 for(int i=0; i<n; i++){ 64 for(int j=0; j<m; j++){ 65 if(Map[i][j] == '.')S++; 66 } 67 } 68 memset(vis, 0, sizeof vis); 69 int f = 1; 70 for(int i=0; i<n; i++){ 71 for(int j=0; j<m; j++){ 72 if(Map[i][j]=='.'){ 73 f = 0; 74 s.x = i;s.y = j; 75 cnt = 1; 76 if(S-K>=0)bfs(s); 77 break; 78 } 79 } 80 if(f==0)break; 81 } 82 // debug(); 83 for(int i=0; i<n; i++){ 84 for(int j=0; j<m; j++){ 85 if(vis[i][j]==0 && Map[i][j] == '.'){ 86 Map[i][j] = 'X'; 87 } 88 } 89 } 90 for(int i=0; i<n; i++){ 91 for(int j=0; j<m; j++){ 92 printf("%c", Map[i][j]); 93 } 94 printf(" "); 95 } 96 } 97 return 0; 98 }