@Dmaxiya
2018-08-17T02:29:23.000000Z
字数 4331
阅读 1242
Codeforces
Contests 链接:Educational Codeforces Round 36
过题数:3
排名:1280/5237
要给 个花园浇花,他有 中浇花器可以选择,如果用第 种浇花器浇花,他每秒可以浇连续的 个花园,且不能浇到花园外面,现在问他要选择哪种浇花器,浇花的时间最少,输出最少时间。
求出 ,其中 。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <climits>#include <cstring>#include <string>#include <vector>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <algorithm>#include <functional>#include <iomanip>using namespace std;#define LL long longconst int maxn = 200;int n, k;int num[maxn];int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);// freopen("out.txt", "w", stdout);#endif // LOCALios::sync_with_stdio(false);while(scanf("%d%d", &n, &k) != EOF) {int Min = INT_MAX;for(int i = 0; i < n; ++i) {scanf("%d", &num[i]);if(k % num[i] == 0) {Min = min(Min, k / num[i]);}}printf("%d\n", Min);}return 0;}
在上网,现在有 个标签,编号为 到 ,定义 为最小的翻开着的标签编号, 为最大的翻开着的标签的编号,如果现在他的光标在第 个标签上,他下一步可以将标签移动到 或者 ,他下一步还可以将区间 或者 内的所有标签关闭,最初所有标签的状态都为翻开。问,现在他的光标在 上,如果他想要只关闭 外的标签,最少需要做几步操作。
按 ,, 与 的相对关系,贪心地分类讨论。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <climits>#include <cstring>#include <string>#include <vector>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <algorithm>#include <functional>#include <iomanip>using namespace std;#define LL long longint n, pos, l, r;int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);// freopen("out.txt", "w", stdout);#endif // LOCALios::sync_with_stdio(false);while(scanf("%d%d%d%d", &n, &pos, &l, &r) != EOF) {if(l == 1) {if(r == n) {printf("%d\n", 0);} else {if(pos <= r) {printf("%d\n", r - pos + 1);} else {printf("%d\n", pos - r + 1);}}} else {if(r == n) {if(pos >= l) {printf("%d\n", pos - l + 1);} else {printf("%d\n", l - pos + 1);}} else {if(pos >= l) {if(pos <= r) {printf("%d\n", r - l + min(pos - l, r - pos) + 2);} else {printf("%d\n", pos - l + 2);}} else {printf("%d\n", r - pos + 2);}}}}return 0;}
给定两个数字 ,求将 的每个位置上的数字排列后,能够得到的不大于 的最大的数字,题目保证有解。
一遍深搜。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <climits>#include <cstring>#include <string>#include <vector>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <algorithm>#include <functional>#include <iomanip>using namespace std;#define LL long longchar a[50];LL ten[20];int dig;LL b, ans;int num[50];bool dfs(int depth, LL tmp) {if(depth == -1) {ans = tmp;return true;}for(int i = 9; i >= 0; --i) {if(num[i] != 0) {if(tmp + ten[depth] * i <= b) {--num[i];if(dfs(depth - 1, tmp + ten[depth] * i)) {return true;}++num[i];}}}return false;}int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);// freopen("out.txt", "w", stdout);#endif // LOCALios::sync_with_stdio(false);ten[0] = 1;for(int i = 1; i <= 18; ++i) {ten[i] = ten[i - 1] * 10;}while(scanf("%s%I64d", a, &b) != EOF) {memset(num, 0, sizeof(num));dig = 0;for(int i = 0; a[i]; ++i) {++num[a[i] - '0'];++dig;}--dig;dfs(dig, 0);printf("%I64d\n", ans);}return 0;}
问在一个 个节点, 条边的有向图上,能不能最多删掉一条边,使得这张图变成一个无环图。
最暴力的做法,是将每一条边都删掉一次,删掉之后,拓扑排序判断是否还存在环,但是对于拓扑排序而言,删掉一条边,相当于将一个点的入度减一,如果有多条边指向同一个节点,删掉它们的操作相当于都是将这个节点的入度减一,所以只要将每个点的入度减一,再进行拓扑排序即可。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <climits>#include <cstring>#include <string>#include <vector>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <algorithm>#include <functional>#include <iomanip>using namespace std;#define LL long longconst int maxn = 600;int n, m, u, v;int deg[maxn], in[maxn];bool ins[maxn];queue<int> que;vector<int> G[maxn];bool topsort() {memcpy(in, deg, sizeof(deg));for(int i = 1; i <= n; ++i) {if(in[i] == 0) {que.push(i);}}while(!que.empty()) {int x = que.front();que.pop();int len = G[x].size();for(int i = 0; i < len; ++i) {int pos = G[x][i];--in[pos];if(in[pos] == 0) {que.push(pos);}}}for(int i = 1; i <= n; ++i) {if(in[i] > 0) {return false;}}return true;}int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);// freopen("out.txt", "w", stdout);#endif // LOCALios::sync_with_stdio(false);while(scanf("%d%d", &n, &m) != EOF) {for(int i = 1; i <= n; ++i) {G[i].clear();}for(int i = 0; i < m; ++i) {scanf("%d%d", &u, &v);G[u].push_back(v);++deg[v];}bool f = false;for(int i = 1; i <= n; ++i) {--deg[i];f = topsort();if(f) {break;}++deg[i];}if(f) {printf("YES\n");} else {printf("NO\n");}}return 0;}