当前位置:   article > 正文

Codeforces Round 935 (Div. 3) (A~G)

Codeforces Round 935 (Div. 3) (A~G)

1945A - Setting up Camp 

        题意:三种人安排住宿,a只能跟自己住,b只能三个人住,c能1~3个人,问最终最少房间数

        思路:a单独安排,b放一起,不足三个人的用c补,然后c按照3人一房间尽可能分配

        

  1. void solve()
  2. {
  3. int a , b , c;
  4. cin >> a >> b >> c;
  5. int ans = a + b / 3;
  6. b %= 3;
  7. int res = b + c;
  8. if(res == 0){
  9. cout << ans << endl;
  10. return;
  11. }
  12. if(b){
  13. if(res < 3){
  14. cout << -1 << endl;
  15. }
  16. else{
  17. cout << ans + (res - 1) / 3 + 1 << endl;
  18. }
  19. }
  20. else{
  21. cout << ans + (res - 1) / 3 + 1 << endl;
  22. }
  23. }

1945B - Fireworks 

        题意:装置A每a分钟放一次烟花,装置B每b分钟放一次烟花,烟花能存在m分钟,求空中同时存在最多多少烟花.

        思路:两只烟花必然能同时放,然后再看接下来m分钟能放多少只烟花,这样必然最优

  1. void solve()
  2. {
  3. LL a , b , m;
  4. cin >> a >> b >> m;
  5. //同一时间发射
  6. LL en = m;
  7. cout << (en / a) + (en / b) + 2<< endl;
  8. }

1945C - Left and Right Houses 

        题意:给定01串,要求从中间某个位置分开,其中左侧0的数量大于等于1的数量,右侧1的数量大于等于0的数量,求满足条件的最靠近中心的位置。

        思路:直接模拟

  1. void solve()
  2. {
  3. double n;
  4. cin >> n;
  5. string s;
  6. cin >> s;
  7. s = " " + s;
  8. int left = 0, right = 0;
  9. for(int i = 1 ; i <= (int)n ; i ++){
  10. right += (s[i] == '1');
  11. }
  12. vector<double>ans;
  13. int left_cnt = 0 , right_cnt = n;
  14. for(int i = 0 ; i <= n ; i ++){
  15. if(i > 0){
  16. if(s[i] == '0'){
  17. left++;
  18. }
  19. if(s[i] == '1'){
  20. right--;
  21. }
  22. left_cnt++;
  23. right_cnt--;
  24. }
  25. //在i的右边
  26. if((left_cnt + 1) / 2 <= left && (right_cnt + 1) / 2 <= right){
  27. ans.pb(i);
  28. }
  29. }
  30. int out = 0;
  31. int maxx = 1e8;
  32. for(int i = 0 ; i < ans.size() ; i ++){
  33. double diff = abs(n / 2 - ans[i]);
  34. if(diff < maxx){
  35. out = ans[i];
  36. maxx = diff;
  37. }
  38. }
  39. cout << out << endl;
  40. }

 1945D - Seraphim the Owl 

        题意:

        思路:最终位置必须为a数组,一旦最终位置确定了,那么其中间的选a数组还是b数组都行,因此除了最终位置需要花费a数组的硬币,其余都是a或b的最小值。

  1. void solve()
  2. {
  3. cin >> n >> m;
  4. LL a[n + 5] , b[n + 5];
  5. for(int i = 1 ; i <= n ; i ++)
  6. cin >> a[i];
  7. for(int i = 1 ; i <= n ; i ++)
  8. cin >> b[i];
  9. //如果b[i] < a[i] , 那么就等着前面 , 否则就选上
  10. LL ans = llinf;
  11. LL pre = 0;
  12. for(int i = m + 1 ; i <= n ; i ++){
  13. pre += min(a[i] , b[i]);
  14. }
  15. for(int i = m ; i >= 1 ; i --){
  16. ans = min(ans , a[i] + pre);
  17. pre += min(a[i] , b[i]);
  18. }
  19. cout << ans << endl;
  20. }

 1945E - Binary Search 

        题意:

        思路:可以想到,对于一个给定的排列,其算法中所有需要跟x进行比较的数的位置都是能确定的,如果x所在位置不在需要比较的位置里面,那么只需要将x放到最终的l上面就能满足题意了,因此我们可以枚举第一步,将x放在不需要比较的位置上,然后再将x放入最终的l即可。

  1. void solve()
  2. {
  3. int n , x;
  4. cin >> n >> x;
  5. int pos = 0;
  6. for(int i = 1 ; i <= n ; i ++){
  7. cin >> a[i];
  8. if(a[i] == x)
  9. pos = i;
  10. }
  11. for(int i = 1 ; i <= n ; i ++){
  12. swap(a[i] , a[pos]);
  13. int l = 1 , r = n + 1;
  14. vector<int>path;
  15. while(r - l > 1){
  16. int mid = (l + r) / 2;
  17. if(a[mid] <= x){
  18. l = mid;
  19. }
  20. else
  21. r = mid;
  22. path.pb(mid);
  23. }
  24. int f = 1;
  25. for(auto it : path){
  26. if(it == i){
  27. f = 0;
  28. break;
  29. }
  30. }
  31. if(f){
  32. cout << 2 << endl;
  33. cout << i << " " << pos << endl;
  34. cout << i << " " << l << endl;
  35. return;
  36. }
  37. swap(a[i] , a[pos]);
  38. }
  39. }

1945F - Kirill and Mushrooms 

        题意:现有n个蘑菇,每个蘑菇有一个对应的魔力值,还给定了一个排列,现在需要用蘑菇来制作药水,规定药水的魔力值为所用蘑菇中最小的魔力值 * 所用蘑菇数。同时若用了k个蘑菇,那么排列的前k - 1个数所对应的蘑菇魔力值将变为0.同时魔力值为0的蘑菇不能被用作制作药水。

        思路:枚举拿蘑菇的数量。贪心的思想,每次都拿当前魔力值最高的蘑菇,同时因为多了一个蘑菇,因此会有一个蘑菇的魔力值变成0,若这个0魔力值的蘑菇在所选中蘑菇里面,就重新再拿一个蘑菇,如此不断往复。

  1. void solve()
  2. {
  3. cin >> n;
  4. pair<int,int>a[n + 5];
  5. for(int i = 1 ; i <= n ; i ++){
  6. cin >> a[i].x;
  7. a[i].y = i;
  8. }
  9. int p[n + 5];
  10. p[0] = 0;
  11. for(int i = 1 ; i <= n ; i ++)
  12. cin >> p[i];
  13. auto cmp = [&](pair<int ,int> a , pair<int,int> b){
  14. return a.x > b.x;
  15. };
  16. a[n + 1].x = 0;
  17. sort(a + 1 , a + n + 1 , cmp);
  18. /* for(int i = 1 ; i <= n ; i ++){
  19. cout << a[i].x <<" " << a[i].y << endl;
  20. }*/
  21. map<int,int>mp;//是否在篮子里
  22. map<int,int>vis;//这么多不能在篮子里
  23. LL ans = -1;
  24. LL out = 0;
  25. int id = 0;
  26. int minn = llinf;
  27. for(int cnt = 1 ; id <= n && cnt <= n ; cnt ++ , id++){
  28. if(id > n)
  29. break;
  30. //ban
  31. vis[p[cnt - 1]] = 1;
  32. //out
  33. if(mp.count(p[cnt - 1])){//有了
  34. while(id <= n && vis.count(a[id].y)){
  35. id++;
  36. }
  37. minn = a[id].x;
  38. mp[a[id].y] = 1;
  39. id++;
  40. }
  41. //pick
  42. while(id <= n && vis.count(a[id].y)){
  43. id++;
  44. }
  45. minn = a[id].x;
  46. mp[a[id].y] = 1;
  47. if(minn * cnt > ans){
  48. ans = minn * cnt;
  49. out = cnt;
  50. }
  51. }
  52. cout << ans << " " << out <<endl;
  53. }

1945G - Cook and Porridge 

        题意:

        思路:看代码

  1. // Problem: G. Cook and Porridge
  2. // Contest: Codeforces - Codeforces Round 935 (Div. 3)
  3. // URL: https://codeforces.com/contest/1945/problem/G
  4. // Memory Limit: 256 MB
  5. // Time Limit: 2000 ms
  6. //
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9. #define LL long long
  10. #define pb push_back
  11. #define x first
  12. #define y second
  13. #define endl '\n'
  14. const LL maxn = 4e05+7;
  15. const LL N = 5e05+10;
  16. const LL mod = 1e09+7;
  17. const int inf = 0x3f3f3f3f;
  18. const LL llinf = 5e18;
  19. typedef pair<int,int>pl;
  20. priority_queue<LL , vector<LL>, greater<LL> >mi;//小根堆
  21. priority_queue<LL> ma;//大根堆
  22. LL gcd(LL a, LL b){
  23. return b > 0 ? gcd(b , a % b) : a;
  24. }
  25. LL lcm(LL a , LL b){
  26. return a / gcd(a , b) * b;
  27. }
  28. int n , m;
  29. vector<int>a(N , 0);
  30. void init(int n){
  31. for(int i = 0 ; i <= n ; i ++){
  32. a[i] = 0;
  33. }
  34. }
  35. struct BIT{//Binary indexed Tree(树状数组)
  36. int n;
  37. vector<int> tr;
  38. BIT(int n) : n(n) , tr(n + 1 , 0){
  39. }
  40. int lowbit(int x){
  41. return x & -x;
  42. }
  43. void modify(int x , int modify_number){
  44. for(int i = x ; i <= n ; i += lowbit(i)){
  45. tr[i] += modify_number;
  46. }
  47. }
  48. void modify(int l , int r , int modify_number){
  49. modify(l , modify_number);
  50. modify(r + 1 , -modify_number);
  51. }
  52. int query(int x){
  53. int res = 0;
  54. for(int i = x ; i ; i -= lowbit(i))
  55. res += tr[i];
  56. return res;
  57. }
  58. int query(int x , int y){
  59. return query(y) - query(x);
  60. }
  61. };
  62. struct Eat{//吃饭队列
  63. int ti;//归队时间
  64. int ss;//吃饭时间
  65. int id;//编号
  66. friend bool operator < (struct Eat a , struct Eat b){
  67. if(a.ti != b.ti){
  68. return a.ti > b.ti;
  69. }
  70. else{
  71. return a.ss > b.ss;
  72. }
  73. }
  74. };
  75. struct Rank{//就绪队列 优先级高的在前面,统一优先级到达时间晚的在后面
  76. int kk;//优先级
  77. int time;//到达时间
  78. int id;//编号
  79. int num;
  80. friend bool operator < (struct Rank a , struct Rank b){
  81. if(a.kk != b.kk){
  82. return a.kk < b.kk;
  83. }
  84. else if(a.time != b.time){
  85. return a.time > b.time;
  86. }
  87. else{
  88. return a.num > b.num;
  89. }
  90. }
  91. };
  92. void solve()
  93. {
  94. cin >> n >> m;
  95. pair<int,int>stu[n + 5];
  96. for(int i = 1 ; i <= n ; i ++){
  97. cin >> stu[i].x >> stu[i].y;
  98. }
  99. int num = 0;
  100. //怎么判断第i个人能否喝到粥? -> 前面没有人
  101. //怎么计算第i个人第一次喝到粥的时刻? -> 模拟时间
  102. //若第i个人会被插队的条件是,他之后没有比那个人优先级高的人了,之后加的也必然不会被卡
  103. vector<int>back(n + 5 , 0);//第i个人之后的最大优先,第i个人喝完之后,会在大于等于back[j]的后面,若没有,则放到第一个
  104. back[n + 1] = 0;
  105. for(int i = n ; i >= 1 ; i --){
  106. back[i] = max(back[i + 1] , stu[i].x);
  107. }
  108. priority_queue<Eat>e;//吃饭队列,时间到了归队
  109. priority_queue<Rank>r;//等待队列
  110. int id = 1;
  111. int ans = -1;
  112. for(int i = 1 ; i <= m ; i ++){
  113. if(r.empty() || back[id] >= r.top().kk){
  114. e.push({i + stu[id].y , stu[id].y , id});
  115. id++;
  116. if(id == n + 1){
  117. ans = i;
  118. break;
  119. }
  120. }
  121. else{
  122. int idx = r.top().id;
  123. r.pop();
  124. e.push({i + stu[idx].y , stu[idx].y , idx});
  125. }
  126. while(!e.empty() && e.top().ti == i){
  127. int idx = e.top().id;
  128. e.pop();
  129. r.push({stu[idx].x , i , idx , ++num});
  130. }
  131. }
  132. cout << ans << endl;
  133. }
  134. int main()
  135. {
  136. ios::sync_with_stdio(false);
  137. cin.tie(0);
  138. cout.tie(0);
  139. cout.precision(10);
  140. int t=1;
  141. cin>>t;
  142. while(t--)
  143. {
  144. solve();
  145. }
  146. return 0;
  147. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/279605
推荐阅读
相关标签
  

闽ICP备14008679号