Codeforces Round #222 (Div. 2)
来源:互联网 发布:范冰冰的生知其图片 编辑:程序博客网 时间:2024/06/05 09:49
Two players are playing a game. First each of them writes an integer from 1 to 6, and then a dice is thrown. The player whose written number got closer to the number on the dice wins. If both payers have the same difference, it's a draw.
The first player wrote number a, the second player wrote number b. How many ways to throw a dice are there, at which the first player wins, or there is a draw, or the second player wins?
The single line contains two integers a and b (1 ≤ a, b ≤ 6) — the numbers written on the paper by the first and second player, correspondingly.
Print three integers: the number of ways to throw the dice at which the first player wins, the game ends with a draw or the second player wins, correspondingly.
2 5
3 0 3
2 4
2 1 3
The dice is a standard cube-shaped six-sided object with each side containing a number from 1 to 6, and where all numbers on all sides are distinct.
You can assume that number a is closer to number x than number b, if |a - x| < |b - x|.
A题:a,bi两个数字,扔一个色字,求分别与a,b求差的绝对值,谁小就谁赢,相等平局,输出情况。
水:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>int a, b;int main() { int ans1 = 0, ans2 = 0, ans3 = 0; scanf("%d%d", &a, &b); for (int i = 1; i <= 6; i ++) { if (abs(a - i) < abs(b - i)) ans1++; if (abs(a - i) == abs(b - i)) ans2++; if (abs(a - i) > abs(b - i)) ans3++; } printf("%d %d %d\n", ans1, ans2, ans3); return 0;}
B题:随即1-k表示半决赛前k名直接晋级,剩下的人按时间排,贪心。
#include <stdio.h>#include <string.h>const int N = 100005;int n, a[N], b[N];int an[N], bn[N];void init() { scanf("%d", &n); memset(an, 0, sizeof(an)); memset(bn, 0, sizeof(bn)); for (int i = 0; i < n; i ++) scanf("%d%d", &a[i], &b[i]);}void solve() { int l = 0, r = 0, i; for (i = 0; i < n / 2; i ++) an[i] = bn[i] = 1; for (i = 0; i < n; i ++) { if (a[l] < b[r]) { an[l++] = 1; } else { bn[r++] = 1; } } for (i = 0; i < n; i ++) printf("%d", an[i]); printf("\n"); for (i = 0; i < n; i ++) printf("%d", bn[i]); printf("\n");}int main() { init(); solve(); return 0;}
C题:给定k步,要求填到只剩一块连接的空白。搜索题
#include <stdio.h>#include <string.h>#include <algorithm>#define max(a,b) (a)>(b)?(a):(b)#define min(a,b) (a)<(b)?(a):(b)using namespace std;const int N = 505;const int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};char g[N][N];int n, m, k, pn, sum, Max_v, Max, snum;struct P { int x, y, v;} p[N * N];int cmp(P a, P b) { return a.v > b.v;}void init() { sum = 0; Max = 0; snum = 0; memset(p, 0, sizeof(p)); scanf("%d%d%d", &n, &m, &k); for (int i = 0; i < n; i ++) scanf("%s", g[i]);}void dfs1(int x, int y) { g[x][y] = 'X'; p[pn].v++; for (int i = 0; i < 4; i ++) { int xx = x + d[i][0]; int yy = y + d[i][1]; if (xx >= 0 && xx < n && yy >= 0 && yy < m && g[xx][yy] == '.') dfs1(xx, yy); }}void dfs2(int x, int y) { if (snum == sum - k) { return; } g[x][y] = '.'; snum ++; for (int i = 0; i < 4; i ++) { int xx = x + d[i][0]; int yy = y + d[i][1]; if (xx >= 0 && xx < n && yy >= 0 && yy < m && g[xx][yy] == 'X') dfs2(xx, yy); }}void print() { for (int i = 0; i < n; i ++) printf("%s\n", g[i]);}void solve() { for (int i = 0; i < n; i ++) for (int j = 0; j < m; j ++) { if (g[i][j] == '.') { dfs1(i, j); sum += p[pn].v; if (Max < p[pn].v) { Max_v = pn; Max = p[pn].v; } p[pn].x = i; p[pn].y = j; pn++; } } dfs2(p[Max_v].x, p[Max_v].y); print();}int main() { init(); solve(); return 0;}
D题:m个bug每个bug有级别,n个人,每个人有级别和需求,现在总共有s个需求,求最少天数完成的方法,并且输出方案。
思路:二分+贪心+优先队列优化
#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>using namespace std;const int N = 100005;int n, m, s, a[N], ans[N];struct S { int b, c, id; friend bool operator < (S a, S b) { return a.c > b.c; }} st[N];struct B { int a, id;} bd[N];int cmp(S a, S b) { return a.b > b.b;}int cmp1(B a, B b) { return a.a < b.a;}void init() { int i; scanf("%d%d%d", &n, &m, &s); for (i = 0; i < m; i ++) { scanf("%d", &bd[i].a); bd[i].id = i; } for (i = 0; i < n; i ++) { scanf("%d", &st[i].b); st[i].id = i; } for (i = 0; i < n; i ++) scanf("%d", &st[i].c); sort(bd, bd + m, cmp1); sort(st, st + n, cmp);}bool judge1(int time) { int ss = s, sn = 0; priority_queue<S>Q; for (int i = m - 1; i >= 0; i -= time) { while (st[sn].b >= bd[i].a && sn != n) {Q.push(st[sn++]);} if (Q.empty()) return false; S t = Q.top(); Q.pop(); if (ss < t.c) return false; ss -= t.c; int e = i - time + 1; if (e < 0) e = 0; for (int j = i; j >= e; j--) { ans[bd[j].id] = t.id; } } return true;}bool judge(int time) { int ss = s, sn = 0; priority_queue<S>Q; for (int i = m - 1; i >= 0; i -= time) { while (st[sn].b >= bd[i].a && sn != n) {Q.push(st[sn++]);} if (Q.empty()) return false; S t = Q.top(); Q.pop(); if (ss < t.c) return false; ss -= t.c; } return true;}void solve() { int l = 0, r = m; if (!judge(r)) { printf("NO\n"); return; } while (l < r) { int mid = (l + r) / 2; if (judge(mid)) r = mid; else l = mid + 1; } judge1(r); printf("YES\n"); for (int i = 0; i < m - 1; i++) printf("%d ", ans[i] + 1); printf("%d\n", ans[m - 1] + 1);}int main() { init(); solve(); return 0;}
E题:dota2 进行 bp操作,每个英雄有一个能力值,玩家1,2分别进行b,p操作,每个玩家都尽量往好了取,要求最后能力值的差,
思路:dp+贪心+位运算,对于一个玩家进行pick时,肯定选能力值最大的,这是贪心。进行ban时。要把所有情况找出来。用dp的记忆化搜索。对于状态利用2进制的位运算。
代码:
#include <stdio.h>#include <string.h>#include <algorithm>#define min(a,b) (a)<(b)?(a):(b)#define max(a,b) (a)>(b)?(a):(b)using namespace std;const int INF = 0x3f3f3f3f;const int MAXN = 1111111;const int N = 105;const int M = 25;int cmp(int a, int b) { return a > b;}int n, m, s[N], c[M], t[M], dp[MAXN], st;void init() { memset(dp, INF, sizeof(dp)); scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &s[i]); scanf("%d%*c", &m); for (int j = 0; j < m; j++) scanf("%c%*c%d%*c", &c[j], &t[j]);}int DP(int state, int num) { if (dp[state] != INF) return dp[state]; int &ans = dp[state];ans = 0; if (c[num] == 'p') { int bit; for (bit = 0; bit < m; bit++) if ((state & (1<<bit))) break; if (t[num] == 1) ans = (DP((state^(1<<bit)), num + 1) + s[bit]); else ans = (DP((state^(1<<bit)), num + 1) - s[bit]); } else if (c[num] == 'b') {if (t[num] == 1) ans = -INF;else ans = INF; for (int i = 0; i < m; i++) { if ((state & (1<<i))) {if (t[num] == 1)ans = max(ans, DP((state^(1<<i)), num + 1));else ans = min(ans, DP((state^(1<<i)), num + 1)); } } } return ans;}void solve() { sort(s, s + n, cmp); st = (1<<m) - 1; printf("%d\n", DP(st, 0));}int main() { init(); solve(); return 0;}
- Codeforces Round #222 (Div. 2)
- Codeforces Round #222 (Div. 2)
- Codeforces Round #222 (Div. 2)
- Codeforces Round #222 (Div. 2)
- Codeforces Round #222 (Div. 2)
- 【索引】CodeForces Round #222 (Div. 2)
- Codeforces Round #222 (Div. 2) ABCD
- Codeforces Round #222 (Div. 1)
- Codeforces Round #222 (Div. 1)
- Codeforces Round #102 (Div. 2)
- Codeforces Round #103 (Div. 2)
- Codeforces Round #103 (Div. 2)
- Codeforces Round #104 (Div. 2)
- Codeforces Round #105 (Div. 2)
- Codeforces Round #105 (Div. 2)
- Codeforces Round #107 (Div. 2)
- Codeforces Round #108 (Div. 2)
- Codeforces Round #110 (Div. 2)
- Win7下IIS报503Service Unavailable错误的解决
- 判断一个点是否在指定区域内
- Java开发中的23种设计模式详解【经典】(转)
- Oracle DECODE函数的语法介绍
- 深入浅出 - Android系统移植与平台开发(四)- Android启动流程
- Codeforces Round #222 (Div. 2)
- 字符串操作
- openstack 基础知识——eventlet
- storm开发总结【三】
- [零基础学软件开发13]循环语句介绍goto
- make 当中各种赋值说明 = := ?= +=
- 需要学习的资料
- Oracle 锁级别查询脚本
- 菱角