@Dmaxiya
2018-08-17T02:30:32.000000Z
字数 7088
阅读 1337
Codeforces
Contests 链接:Codeforces Round #303(Div.2)
过题数:4
排名:2/16
给出一个二维矩阵,其中第 行第 列表示第 辆车与第 辆车相遇后的状态, 表示两辆车没有相遇,题目保证 只会出现在对角线上, 表示两辆车相遇后不回头, 表示第 辆车相遇后回头, 表示第 辆车相遇后回头, 表示第 辆车与第 辆车相遇后,两辆车都回头。如果某一辆车在与其他车相遇后从没有回头过,那么这辆车就是一辆“好车”,求好车的数量。
先假设所有的车都是“好车”,回头一次则这辆车就不是好车,用一个数组来标记状态,最后输出结果即可。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <climits>#include <cfloat>#include <cstring>#include <string>#include <sstream>#include <vector>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <algorithm>#include <ctime>#include <functional>#include <iomanip>#include <sstream>#include <io.h>#include <conio.h>using namespace std;#define LL long longconst int maxn = 200;int n, cnt;int ans[maxn];bool bad[maxn];int num[maxn][maxn];int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);// freopen("out.txt", "w", stdout);#endif // LOCAL// ios::sync_with_stdio(false);while(scanf("%d", &n) != EOF) {memset(bad, 0, sizeof(bad));for(int i = 1; i <= n; ++i) {for(int j = 1; j <= n; ++j) {scanf("%d", &num[i][j]);if(num[i][j] == 1) {bad[i] = true;} else if(num[i][j] == 2) {bad[j] = true;} else if(num[i][j] == 3) {bad[i] = true;bad[j] = true;}}}cnt = 0;for(int i = 1; i <= n; ++i) {if(!bad[i]) {ans[cnt++] = i;}}printf("%d\n", cnt);if(cnt != 0) {for(int i = 0; i < cnt; ++i) {if(i != 0) {printf(" ");}printf("%d", ans[i]);}printf("\n");}}return 0;}
定义两个字符串的距离为:两个字符串所有不同字符的个数,给定两个字符串 和 ,输出任意一个到这两个字符串距离相等的字符串 ,如果不存在字符串 满足上述条件,则输出 "".
所有字符串只有'0','1'两种字符。
先计算两个字符串的距离 ,如果为奇数,则不存在字符串 ,否则令 。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <climits>#include <cfloat>#include <cstring>#include <string>#include <sstream>#include <vector>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <algorithm>#include <ctime>#include <functional>#include <iomanip>#include <sstream>#include <io.h>#include <conio.h>using namespace std;#define LL long longconst int maxn = 100000 + 100;int cnt;char s[maxn], t[maxn];int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);// freopen("out.txt", "w", stdout);#endif // LOCAL// ios::sync_with_stdio(false);while(scanf("%s%s", s, t) != EOF) {cnt = 0;for(int i = 0; s[i]; ++i) {if(s[i] != t[i]) {++cnt;}}if(cnt % 2 == 1) {printf("impossible\n");continue;}int ccnt = cnt / 2;for(int i = 0; s[i]; ++i) {if(s[i] == t[i]) {printf("%c", s[i]);} else {if(cnt > ccnt) {printf("%c", s[i]);--cnt;} else {printf("%c", t[i]);}}}printf("\n");}return 0;}
最初有 棵树排列成一行,每棵树的位置为 ,高度为 ,一个伐木工人砍树,每砍一棵树,这棵树就会往左或者往右倾倒,这棵树就占据了 或者 的区间,且初始每棵树占据区间 ,要求每棵树被砍倒的时候,在它倒下的范围内没有其他树种植或者在这个区间内。
先在负无穷的位置种第 棵树,高度为 ,在正无穷的位置种第 棵树,高度为 ,用一个变量 标记第 树是否向右倒,如果第 棵树是向右倒的,就判断 是否小于 ,如果小于,则第 棵树向左倒,否则判断 是否小于 ,如果小于,则这棵树向右倒,否则这棵树就不倒。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <climits>#include <cfloat>#include <cstring>#include <string>#include <sstream>#include <vector>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <algorithm>#include <ctime>#include <functional>#include <iomanip>#include <sstream>#include <io.h>#include <conio.h>using namespace std;#define LL long longconst LL INF = 1e18;const int maxn = 100000 + 100;struct Node {LL x, h;};int n, ans;Node node[maxn];int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);// freopen("out.txt", "w", stdout);#endif // LOCAL// ios::sync_with_stdio(false);while(scanf("%d", &n) != EOF) {ans = 0;bool flag = false;node[0].x = -INF;node[n + 1].x = INF;node[0].h = node[n + 1]. h = 0;for(int i = 1; i <= n; ++i) {scanf("%I64d%I64d", &node[i].x, &node[i].h);}for(int i = 1; i <= n; ++i) {if(flag) {if(node[i].x - node[i - 1].x > node[i].h + node[i - 1].h) {++ans;flag = false;} else {if(node[i + 1].x - node[i].x > node[i].h) {flag = true;++ans;} else {flag = false;}}} else {if(node[i].x - node[i - 1].x > node[i].h) {++ans;flag = false;} else {if(node[i + 1].x - node[i].x > node[i].h) {flag = true;++ans;} else {flag = false;}}}}printf("%d\n", ans);}return 0;}
有 个人在排队,排在队首的人先被服务,每个人都有一个服务时间 ,如果某个人的等待时间超过服务时间,这个人就会感到不满,但是可以交换每个人的位置,使得尽可能多的人感到满意,输出最多能够使多少人感到满意。
要使每个人的等待时间都最短,就让 小的人排在前面, 大的人排在后面, 扫一遍就可以了。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <climits>#include <cfloat>#include <cstring>#include <string>#include <sstream>#include <vector>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <algorithm>#include <ctime>#include <functional>#include <iomanip>#include <sstream>#include <io.h>#include <conio.h>using namespace std;#define LL long longconst int maxn = 100000 + 100;int n;LL num[maxn];int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);// freopen("out.txt", "w", stdout);#endif // LOCAL// ios::sync_with_stdio(false);while(scanf("%d", &n) != EOF) {for(int i = 0; i < n; ++i) {scanf("%I64d", &num[i]);}sort(num, num + n);LL sum = num[0];int ans = 1;for(int i = 1; i < n; ++i) {if(num[i] >= sum) {++ans;sum += num[i];}}printf("%d\n", ans);}return 0;}
给定一个 个节点 条边的无向图,和图上的一个点 ,找到一棵以 点为根的树,这棵树上所有点到 点的距离都是图上到 点的最短距离,输出这棵树的最小边权和以及被选中的边的编号。
跑迪杰斯特拉最短路的时候,记录一下每个节点到节点 的最短距离的边的下标 ,如果 ,则更新 ,如果 ,则比较 与 ,如果 的长度更短,则更新。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <climits>#include <cfloat>#include <cstring>#include <string>#include <sstream>#include <vector>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <algorithm>#include <ctime>#include <functional>#include <iomanip>#include <sstream>#include <io.h>#include <conio.h>using namespace std;#define LL long longconst int maxn = 300000 + 100;struct Node {int pos;LL dis;int Index;int Next;Node() {}Node(int p, LL d) {pos = p;dis = d;}};bool operator<(const Node &a, const Node &b) {return a.dis > b.dis;}int n, m, u, v, pos, cnt;LL d, ans;LL dis[maxn];int pre[maxn];LL ddis[maxn];int IIndex[maxn];Node node[maxn << 1];int head[maxn];priority_queue<Node> que;bool st[maxn];void unit(int x, int y, LL d, int I) {node[cnt].dis = d;node[cnt].Index = I;node[cnt].pos = y;node[cnt].Next = head[x];head[x] = cnt++;}void dij(int s) {memset(dis, 0x3f, sizeof(dis));dis[s] = 0;que.push(Node(s, 0));while(!que.empty()) {Node tmp = que.top();que.pop();for(int i = head[tmp.pos]; i != -1; i = node[i].Next) {pos = node[i].pos;d = node[i].dis;int Index = node[i].Index;if(dis[pos] > tmp.dis + d) {st[pre[pos]] = false;st[Index] = true;pre[pos] = Index;dis[pos] = tmp.dis + d;que.push(Node(pos, dis[pos]));} else if(dis[pos] == tmp.dis + d) {st[pre[pos]] = false;st[Index] = true;pre[pos] = Index;}}}}int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);// freopen("out.txt", "w", stdout);#endif // LOCAL// ios::sync_with_stdio(false);while(scanf("%d%d", &n, &m) != EOF) {ans = 0;cnt = 0;memset(head, -1, sizeof(head));memset(st, 0, sizeof(st));memset(pre, 0, sizeof(pre));for(int i = 1; i <= m; ++i) {scanf("%d%d%I64d", &u, &v, &d);ddis[i] = d;unit(u, v, d, i);unit(v, u, d, i);}scanf("%d", &pos);dij(pos);int ccnt = 0;for(int i = 1; i <= m; ++i) {if(st[i]) {ans += ddis[i];IIndex[ccnt++] = i;}}printf("%I64d\n", ans);for(int i = 0; i < ccnt; ++i) {if(i != 0) {printf(" ");}printf("%d", IIndex[i]);}printf("\n");}return 0;}