[关闭]
@Dmaxiya 2018-08-17T10:29:23.000000Z 字数 4331 阅读 1042

Educational Codeforces Round 36

Codeforces


Contests 链接:Educational Codeforces Round 36
过题数:3
排名:1280/5237

A. Garden

题意

要给 个花园浇花,他有 中浇花器可以选择,如果用第 种浇花器浇花,他每秒可以浇连续的 个花园,且不能浇到花园外面,现在问他要选择哪种浇花器,浇花的时间最少,输出最少时间。

数据范围

题解

求出 ,其中

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. #include <functional>
  17. #include <iomanip>
  18. using namespace std;
  19. #define LL long long
  20. const int maxn = 200;
  21. int n, k;
  22. int num[maxn];
  23. int main() {
  24. #ifdef LOCAL
  25. freopen("test.txt", "r", stdin);
  26. // freopen("out.txt", "w", stdout);
  27. #endif // LOCAL
  28. ios::sync_with_stdio(false);
  29. while(scanf("%d%d", &n, &k) != EOF) {
  30. int Min = INT_MAX;
  31. for(int i = 0; i < n; ++i) {
  32. scanf("%d", &num[i]);
  33. if(k % num[i] == 0) {
  34. Min = min(Min, k / num[i]);
  35. }
  36. }
  37. printf("%d\n", Min);
  38. }
  39. return 0;
  40. }

B. Browser

题意

在上网,现在有 个标签,编号为 ,定义 为最小的翻开着的标签编号, 为最大的翻开着的标签的编号,如果现在他的光标在第 个标签上,他下一步可以将标签移动到 或者 ,他下一步还可以将区间 或者 内的所有标签关闭,最初所有标签的状态都为翻开。问,现在他的光标在 上,如果他想要只关闭 外的标签,最少需要做几步操作。

数据范围

题解

的相对关系,贪心地分类讨论。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. #include <functional>
  17. #include <iomanip>
  18. using namespace std;
  19. #define LL long long
  20. int n, pos, l, r;
  21. int main() {
  22. #ifdef LOCAL
  23. freopen("test.txt", "r", stdin);
  24. // freopen("out.txt", "w", stdout);
  25. #endif // LOCAL
  26. ios::sync_with_stdio(false);
  27. while(scanf("%d%d%d%d", &n, &pos, &l, &r) != EOF) {
  28. if(l == 1) {
  29. if(r == n) {
  30. printf("%d\n", 0);
  31. } else {
  32. if(pos <= r) {
  33. printf("%d\n", r - pos + 1);
  34. } else {
  35. printf("%d\n", pos - r + 1);
  36. }
  37. }
  38. } else {
  39. if(r == n) {
  40. if(pos >= l) {
  41. printf("%d\n", pos - l + 1);
  42. } else {
  43. printf("%d\n", l - pos + 1);
  44. }
  45. } else {
  46. if(pos >= l) {
  47. if(pos <= r) {
  48. printf("%d\n", r - l + min(pos - l, r - pos) + 2);
  49. } else {
  50. printf("%d\n", pos - l + 2);
  51. }
  52. } else {
  53. printf("%d\n", r - pos + 2);
  54. }
  55. }
  56. }
  57. }
  58. return 0;
  59. }

C. Permute Digits

题意

给定两个数字 ,求将 的每个位置上的数字排列后,能够得到的不大于 的最大的数字,题目保证有解。

数据范围

题解

一遍深搜。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. #include <functional>
  17. #include <iomanip>
  18. using namespace std;
  19. #define LL long long
  20. char a[50];
  21. LL ten[20];
  22. int dig;
  23. LL b, ans;
  24. int num[50];
  25. bool dfs(int depth, LL tmp) {
  26. if(depth == -1) {
  27. ans = tmp;
  28. return true;
  29. }
  30. for(int i = 9; i >= 0; --i) {
  31. if(num[i] != 0) {
  32. if(tmp + ten[depth] * i <= b) {
  33. --num[i];
  34. if(dfs(depth - 1, tmp + ten[depth] * i)) {
  35. return true;
  36. }
  37. ++num[i];
  38. }
  39. }
  40. }
  41. return false;
  42. }
  43. int main() {
  44. #ifdef LOCAL
  45. freopen("test.txt", "r", stdin);
  46. // freopen("out.txt", "w", stdout);
  47. #endif // LOCAL
  48. ios::sync_with_stdio(false);
  49. ten[0] = 1;
  50. for(int i = 1; i <= 18; ++i) {
  51. ten[i] = ten[i - 1] * 10;
  52. }
  53. while(scanf("%s%I64d", a, &b) != EOF) {
  54. memset(num, 0, sizeof(num));
  55. dig = 0;
  56. for(int i = 0; a[i]; ++i) {
  57. ++num[a[i] - '0'];
  58. ++dig;
  59. }
  60. --dig;
  61. dfs(dig, 0);
  62. printf("%I64d\n", ans);
  63. }
  64. return 0;
  65. }

D. Almost Acyclic Graph

题意

问在一个 个节点, 条边的有向图上,能不能最多删掉一条边,使得这张图变成一个无环图。

数据范围

题解

最暴力的做法,是将每一条边都删掉一次,删掉之后,拓扑排序判断是否还存在环,但是对于拓扑排序而言,删掉一条边,相当于将一个点的入度减一,如果有多条边指向同一个节点,删掉它们的操作相当于都是将这个节点的入度减一,所以只要将每个点的入度减一,再进行拓扑排序即可。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. #include <functional>
  17. #include <iomanip>
  18. using namespace std;
  19. #define LL long long
  20. const int maxn = 600;
  21. int n, m, u, v;
  22. int deg[maxn], in[maxn];
  23. bool ins[maxn];
  24. queue<int> que;
  25. vector<int> G[maxn];
  26. bool topsort() {
  27. memcpy(in, deg, sizeof(deg));
  28. for(int i = 1; i <= n; ++i) {
  29. if(in[i] == 0) {
  30. que.push(i);
  31. }
  32. }
  33. while(!que.empty()) {
  34. int x = que.front();
  35. que.pop();
  36. int len = G[x].size();
  37. for(int i = 0; i < len; ++i) {
  38. int pos = G[x][i];
  39. --in[pos];
  40. if(in[pos] == 0) {
  41. que.push(pos);
  42. }
  43. }
  44. }
  45. for(int i = 1; i <= n; ++i) {
  46. if(in[i] > 0) {
  47. return false;
  48. }
  49. }
  50. return true;
  51. }
  52. int main() {
  53. #ifdef LOCAL
  54. freopen("test.txt", "r", stdin);
  55. // freopen("out.txt", "w", stdout);
  56. #endif // LOCAL
  57. ios::sync_with_stdio(false);
  58. while(scanf("%d%d", &n, &m) != EOF) {
  59. for(int i = 1; i <= n; ++i) {
  60. G[i].clear();
  61. }
  62. for(int i = 0; i < m; ++i) {
  63. scanf("%d%d", &u, &v);
  64. G[u].push_back(v);
  65. ++deg[v];
  66. }
  67. bool f = false;
  68. for(int i = 1; i <= n; ++i) {
  69. --deg[i];
  70. f = topsort();
  71. if(f) {
  72. break;
  73. }
  74. ++deg[i];
  75. }
  76. if(f) {
  77. printf("YES\n");
  78. } else {
  79. printf("NO\n");
  80. }
  81. }
  82. return 0;
  83. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注