当前位置:   article > 正文

Codeforces Round 941 (Div. 2) (A~D)

Codeforces Round 941 (Div. 2) (A~D)

1966A - Card Exchange 

        题意:

       思路:手玩一下发现当存在某个数字个数超过k个,那么就能一直操作下去。那么答案就是k-1.

  1. void solve()
  2. {
  3. cin >> n >> m;
  4. map<int,int>mp;
  5. int maxx = 1;
  6. for(int i = 0 ; i < n ; i ++){
  7. int x;
  8. cin >> x;
  9. mp[x]++;
  10. maxx = max(maxx , mp[x]);
  11. }
  12. if(n < m){
  13. cout << n <<endl;
  14. }
  15. else{
  16. if(maxx >= m){
  17. cout << m - 1 << endl;
  18. }
  19. else{
  20. cout << n <<endl;
  21. }
  22. }
  23. }

1966B - Rectangle Filling 

        题意:

        思路:若要使得所有方格同色,关键在于四个角上的颜色,若对角上的颜色一样就能直接将所有格子变为同色。因此本题变为能否使得对角上颜色相同,分类讨论

        

  1. void solve()
  2. {
  3. cin >> n >> m;
  4. int mp[n + 5][m + 5];
  5. for(int i = 1 ; i <= n ; i ++){
  6. string str;
  7. cin >> str;
  8. for(int j = 1 ; j <= m ; j ++){
  9. if(str[j - 1] == 'W'){
  10. mp[i][j] = 1;
  11. }
  12. else
  13. mp[i][j] = 0;
  14. }
  15. }
  16. if(n == 1){
  17. if(mp[1][1] != mp[1][m]){
  18. cout << "NO\n";
  19. }
  20. else{
  21. cout<<"YES\n";
  22. }
  23. return;
  24. }
  25. if(m == 1){
  26. if(mp[1][1] == mp[n][1]){
  27. cout<<"YES\n";
  28. }
  29. else{
  30. cout<<"NO\n";
  31. }
  32. return;
  33. }
  34. if(mp[1][1] == mp[n][m] || mp[1][m] == mp[n][1]){
  35. cout<<"YES\n";
  36. }
  37. else{
  38. if(mp[1][1] == mp[1][m]){
  39. for(int i = 1 ; i <= m ; i ++){
  40. if(mp[1][i] != mp[1][1]){
  41. cout <<"YES\n";
  42. return;
  43. }
  44. }
  45. for(int i = 1 ; i <= m ; i ++){
  46. if(mp[n][i] != mp[n][1]){
  47. cout <<"YES\n";
  48. return;
  49. }
  50. }
  51. cout <<"NO\n";
  52. }
  53. else{
  54. for(int i = 1 ; i <= n ; i ++){
  55. if(mp[i][1] != mp[1][1]){
  56. cout <<"YES\n";
  57. return;
  58. }
  59. }
  60. for(int i = 1 ; i <= n ; i ++){
  61. if(mp[i][m] != mp[n][m]){
  62. cout <<"YES\n";
  63. return;
  64. }
  65. }
  66. cout <<"NO\n";
  67. }
  68. }
  69. }

1966C - Everything Nim 

        题意:

        思路:为了方便考虑,我们令所有大小相同的堆为一个堆。接下来考虑终态:即只剩下一个堆。然后考虑若此时存在两个堆,那么对于Alice而言,其操作可以使得小的那个堆只剩下1,下一步Bob必须选1,然后Alice就胜利了。相反,若小的那个堆一开始就是1,那么Alice就输了。接下来推广到若干堆的情况:对于任意一方而言,若最小堆不是1,那么便可以控制胜利,于是我们只需要枚举到最小堆不是1的情况即可,然后看是谁在操作就是谁赢。

  1. void solve()
  2. {
  3. cin >> n;
  4. set<int>st;
  5. for(int i = 1 ; i <= n ; i ++){
  6. int x;
  7. cin >> x;
  8. st.insert(x);
  9. }
  10. vector<int>v;
  11. for(auto it : st)
  12. v.pb(it);
  13. vector<int>tag;
  14. int len = v.size();
  15. int cnt = 1;
  16. for(int i = 1 ; i < len ; i ++){
  17. if(v[i] - v[i - 1] == 1){
  18. cnt++;
  19. }
  20. else{
  21. tag.pb(cnt);
  22. cnt = 1;
  23. }
  24. }
  25. tag.pb(cnt);
  26. /* for(auto it : tag){
  27. cout << it << endl;
  28. }*/
  29. if(tag.size() == 1){
  30. if(v[0] == 1){
  31. if(tag[0] & 1){
  32. cout <<"Alice\n";
  33. }
  34. else{
  35. cout<<"Bob\n";
  36. }
  37. }
  38. else{
  39. cout<<"Alice\n";
  40. }
  41. }
  42. else{
  43. if(v[0] == 1 && tag[0] % 2 == 1){
  44. cout <<"Bob\n";
  45. }
  46. else
  47. cout<<"Alice\n";
  48. }
  49. // cout << endl;
  50. }

1966D - Missing Subsequence Sum 

        题意:

       思路:首先处理 < k 的部分,我们可以通过二进制的思想来构造整数,例如[1,99]可以用1,2,4,8,16,32,36来表示,其中36代表了99-63 .接下来考虑 > k 的部分,考虑到一个规律:[2,3,4,8,16....2^n]可以表示[2 ,2^{n+1}]的任何数,也就是说通过[m + 1 , 2 * m + 1 , 3 * m + 1 , 4 * m + 1 , 8 * m + 1 ...2^n * m + 1]再配合上前面的[1,m - 1]就能表示出任意>k的数了,这就是构造方案。

        

  1. void solve()
  2. {
  3. //1 ~ 99 101 201 301
  4. //
  5. vector<int>ans;
  6. cin >> n >> m;
  7. int st = 1;
  8. int t = m;
  9. if(m == 1){
  10. ans.pb(2);
  11. ans.pb(3);
  12. ans.pb(4);
  13. int st = 8;
  14. for(int i = 3 ; i < 25 ; i ++){
  15. ans.pb(st);
  16. st *= 2;
  17. }
  18. cout << ans.size() << endl;
  19. for(auto it : ans){
  20. cout << it <<" ";
  21. }
  22. cout << endl;
  23. return ;
  24. }
  25. while(st < t){
  26. ans.pb(st);
  27. t -= st;
  28. st *= 2;
  29. }
  30. if(t - 1)
  31. ans.pb(t - 1);
  32. ans.pb(m + 1);
  33. ans.pb(m * 2 + 1);
  34. ans.pb(m * 3 + 1);
  35. ans.pb(m * 4 + 1);
  36. st = m * 8 + 1;
  37. int len = ans.size();
  38. for(int i = len + 1; i <= 25 ; i ++){
  39. ans.pb(st);
  40. st = st * 2 - 1;
  41. }
  42. cout << ans.size() << endl;
  43. for(auto it : ans){
  44. cout << it <<" ";
  45. }
  46. cout << endl;
  47. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/507012
推荐阅读
相关标签
  

闽ICP备14008679号