• Codeforces Round #750 (Div. 2)(A,B,C,D,F1)


    A. Luntik and Concerts

    Problem - A - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/contest/1582/problem/A题意:a值为1,b值为2,c值为3,给出abc数量,分成两份,求两份最小的差(绝对值).

    思路:直接求总和,奇数输出1,偶数输出0即可.因为321可以随机分配达到平衡(打几个表就知道了).

    1. #include<map>
    2. #include<cmath>
    3. #include<set>
    4. #include<queue>
    5. #include<string>
    6. #include<vector>
    7. #include<cstring>
    8. #include<iostream>
    9. #include<algorithm>
    10. #include<unordered_set>
    11. #include<unordered_map>
    12. #define int long long
    13. using namespace std;
    14. const int N =5e5+10,mod=998244353;
    15. void solve()
    16. {
    17. int a,b,c;
    18. cin>>a>>b>>c;
    19. b*=2,c*=3;
    20. int ans=a+b+c;
    21. if(ans%2)
    22. cout<<"1\n";
    23. else
    24. cout<<"0\n";
    25. return;
    26. }
    27. signed main()
    28. {
    29. int t;
    30. cin>>t;
    31. while(t--)
    32. solve();
    33. return 0;
    34. }

    B. Luntik and Subsequences

    Problem - B - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/contest/1582/problem/B题意:给你一个数组,问可以组成多少个特定数组,特定数组满足自己本身的和与原来数组比差一.

    思路:数组里有n个1时,我们可以去掉这n个1中任意一个,就有n种选法.当含有0时,不论去掉哪个1,我们对于这个0都是由选与不选两种情况,直接用数组里1的个数乘以2的0的个数次方即可.

    1. #include<map>
    2. #include<cmath>
    3. #include<set>
    4. #include<queue>
    5. #include<string>
    6. #include<vector>
    7. #include<cstring>
    8. #include<iostream>
    9. #include<algorithm>
    10. #include<unordered_set>
    11. #include<unordered_map>
    12. #define int long long
    13. using namespace std;
    14. const int N =5e5+10,mod=998244353;
    15. void solve()
    16. {
    17. int x,n,cnt1=0,cnt0=0;
    18. scanf("%lld",&n);
    19. for(int i=1;i<=n;i++)
    20. {
    21. scanf("%lld",&x);
    22. if(x==1)
    23. cnt1++;
    24. if(x==0)
    25. cnt0++;
    26. }
    27. int ans=cnt1*pow(2,cnt0);
    28. printf("%lld\n",ans);
    29. return;
    30. }
    31. signed main()
    32. {
    33. int t;
    34. cin>>t;
    35. while(t--)
    36. solve();
    37. return 0;
    38. }

    C. Grandma Capa Knits a Scarf

    Problem - C - Codeforcesicon-default.png?t=M5H6https://codeforces.com/contest/1582/problem/C题意:给你一个字符串,你可以选择一种字符(小写字母),删除字符串中任一个数的该字符,问最少删除几个字符可以让字符串变成回文.

    思路:枚举26个小写字母,每次确定要对哪个字母进行删除.然后进行双指针模拟,从两边往中间遍历,当两者指针所指的字母相同就继续遍历,不相同看是否可以删除指定的字母来让它变成相同的.一直模拟完进行判断即可.

    1. #include<map>
    2. #include<cmath>
    3. #include<set>
    4. #include<queue>
    5. #include<string>
    6. #include<vector>
    7. #include<cstring>
    8. #include<iostream>
    9. #include<algorithm>
    10. #include<unordered_set>
    11. #include<unordered_map>
    12. using namespace std;
    13. const int N =5e5+10,mod=998244353;
    14. void solve()
    15. {
    16. int f=0;
    17. int n,ans=1e9;
    18. string s,ss;
    19. scanf("%d",&n);
    20. cin>>s;
    21. for(int i=0;i<26;i++)
    22. {
    23. char ch='a'+i;
    24. ss="";
    25. for(int i=0;i<s.size();i++)
    26. {
    27. if(s[i]!=ch)
    28. ss+=s[i];
    29. }
    30. string s1=ss;
    31. reverse(ss.begin(),ss.end());
    32. if(ss!=s1)
    33. {
    34. continue;
    35. }
    36. int tt=0;
    37. int l=0,r=s.size()-1;
    38. while(l<r)
    39. {
    40. while(s[l]!=s[r])
    41. {
    42. if(s[l]!=ch&&s[r]==ch)
    43. r--,tt++;
    44. else if(s[l]==ch&&s[r]!=ch)
    45. l++,tt++;
    46. if(l>r)
    47. break;
    48. }
    49. l++;
    50. r--;
    51. }
    52. ans=min(ans,tt);
    53. f=1;
    54. }
    55. if(f==0)
    56. printf("-1\n");
    57. else
    58. printf("%d\n",ans);
    59. return;
    60. }
    61. signed main()
    62. {
    63. int t;
    64. cin>>t;
    65. while(t--)
    66. solve();
    67. return 0;
    68. }

    D. Vupsen, Pupsen and 0

    Problem - D - Codeforcesicon-default.png?t=M5H6https://codeforces.com/contest/1582/problem/D题意:给你一个不含有0的数组a,要求再构造一个相同长度的数组b,让a[i]*b[j]求和之后为0.b同样不能含有0.

    思路:我们只需要取两个数组元素a[i],a[j],让b[i]=a[j],b[j]=-a[i]即可.但是当出现数组长度是奇数时,要考虑最后剩下或者任取的三个数字的情况,如果我们把三个数中取两个数合并并且按照上文的方法合并要注意,合并的两个数和不能为0!,不然新构造的数组就包含0了.

    1. #include<map>
    2. #include<cmath>
    3. #include<set>
    4. #include<queue>
    5. #include<string>
    6. #include<vector>
    7. #include<cstring>
    8. #include<iostream>
    9. #include<algorithm>
    10. #include<unordered_set>
    11. #include<unordered_map>
    12. using namespace std;
    13. const int N =5e5+10,mod=998244353;
    14. int a[100005];
    15. int b[100005];
    16. void solve()
    17. {
    18. int n;
    19. scanf("%d",&n);
    20. for(int i=1;i<=n;i++)
    21. scanf("%d",&a[i]);
    22. if(n%2==0)
    23. {
    24. for(int i=1;i<=n;i+=2)
    25. {
    26. b[i]=-a[i+1];
    27. b[i+1]=a[i];
    28. }
    29. }
    30. else
    31. {
    32. for(int i=1;i<=n-3;i+=2)
    33. {
    34. b[i]=-a[i+1];
    35. b[i+1]=a[i];
    36. }
    37. if(a[n]+a[n-1]!=0)
    38. {
    39. b[n]=-a[n-2];
    40. b[n-1]=-a[n-2];
    41. b[n-2]=a[n]+a[n-1];
    42. }
    43. else if(a[n]+a[n-2]!=0)
    44. {
    45. b[n]=-a[n-1];
    46. b[n-1]=a[n]+a[n-2];
    47. b[n-2]=-a[n-1];
    48. }
    49. else if(a[n-2]+a[n-1]!=0)
    50. {
    51. b[n]=a[n-2]+a[n-1];
    52. b[n-1]=-a[n];
    53. b[n-2]=-a[n];
    54. }
    55. }
    56. for(int i=1;i<=n;i++)
    57. printf("%d ",b[i]);
    58. printf("\n");
    59. // int sum=0;
    60. // for(int i=1;i<=n;i++)
    61. // sum+=a[i]*b[i];
    62. // cout<<"qwq "<<sum<<"\n";
    63. return;
    64. }
    65. signed main()
    66. {
    67. int t;
    68. cin>>t;
    69. while(t--)
    70. solve();
    71. return 0;
    72. }

    F1. Korney Korneevich and XOR (easy version)

    Problem - F1 - Codeforcesicon-default.png?t=M5H6https://codeforces.com/contest/1582/problem/F1

    题意:给你一个数组,要求出取出一个非递减的子数组以后的一个异或和x,求出所有可以得到的x.

    思路:求疑惑和,a[i]的值<500,所以异或和最大可以为512.我们只需要开一个f数组,去记录异或和为i(下标)的时候,这个非递减数组的最后一位放得什么即可,然后又枚举暴力,详细注释看代码:

    1. #include<map>
    2. #include<cmath>
    3. #include<set>
    4. #include<queue>
    5. #include<string>
    6. #include<vector>
    7. #include<cstring>
    8. #include<iostream>
    9. #include<algorithm>
    10. #include<unordered_set>
    11. #include<unordered_map>
    12. int a[100005];
    13. using namespace std;
    14. const int N =5e5+10,mod=998244353;
    15. int f[600];
    16. //下标i表示数组异或和为i,里面存的是该异或和下数组末尾接的最小是多少
    17. vector<int>ans;
    18. void solve()
    19. {
    20. int n;
    21. scanf("%d",&n);
    22. f[0]=0;
    23. for(int i=1;i<=512;i++)
    24. f[i]=1000;
    25. //初始化
    26. for(int i=1;i<=n;i++)
    27. {
    28. scanf("%d",&a[i]);
    29. }
    30. for(int i=1;i<=n;i++)
    31. {
    32. f[a[i]]=min(f[a[i]],a[i]);
    33. //异或和可以直接是他本身
    34. for(int j=0;j<=512;j++)
    35. {
    36. if(a[i]>=f[j])
    37. f[j^a[i]]=min(f[j^a[i]],a[i]);
    38. //如果当前的数字比异或和为j的数组的末尾还要大,那么就连接上去,并且对末位进行刷新即可,如果异或出来过,就看原来已经异或出来的末尾的数字和a[i]的大小,判断a[i]连接上去了还是不是非递减数组.反之直接连接a[i],因为违背异或出来的肯定是a[i]结尾.
    39. }
    40. }
    41. for(int i=0;i<=512;i++)
    42. {
    43. if(f[i]!=1000)
    44. ans.push_back(i);
    45. }
    46. //把刷新过得异或和存进去
    47. printf("%d\n",ans.size());
    48. for(int i=0;i<ans.size();i++)
    49. {
    50. printf("%d ",ans[i]);
    51. }
    52. return ;
    53. }
    54. signed main()
    55. {
    56. solve();
    57. return 0;
    58. }

    刷!

  • 相关阅读:
    互融云贷款中介平台搭建,助力企业实现数字化智能办公
    SpringCloud & Alibaba 总结
    驱动开发:内核解锁与强删文件
    sql语句 如果为空值显示为0
    SpringBoot+ECharts+Html 字符云/词云案例详解
    外贸网站流量下降可能是这五点原因造成的
    系统架构师2022年案例分析考前
    淘宝退货退款测试用例
    【HDFS】Hadoop RPC中的Responder、Listener、Reader、Handler
    vue面试题4
  • 原文地址:https://blog.csdn.net/qq_49593247/article/details/125556672