• Codeforces Round #802 (Div. 2)(A-D)


    A. Optimal Path

    Problem - A - Codeforcesicon-default.png?t=M5H6https://codeforces.com/contest/1700/problem/A题意,按照从左往右,从上到下的顺序去给一个n*m的表格从1开始赋值,求一条路,令它的权值(路上所有格子的值相加)最小.

    思路:签到,先从第一个格子往右走到边界,再往下走到结果即可.

    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 n,m;
    18. cin>>n>>m;
    19. int ans=0;
    20. ans+=(1+m)*m/2;
    21. ans+=(m+m+(n-1)*m)*n/2;
    22. ans-=m;
    23. cout<<ans<<"\n";
    24. }
    25. signed main()
    26. {
    27. int t;
    28. cin>>t;
    29. while(t--)
    30. solve();
    31. return 0;
    32. }

    B. Palindromic Numbers

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

    题意:给你一个n,还有一个数,让这个数加上这个n为位数的数(无前导0),成为一个回文.

    思路:贪心,模拟,减少操作.当所给的数第一位不是9时,就取一个长度为n,每一位为9的数去减去所给的数,即为结果.如果第一位是9,那我们可以去一个位数为n+1的每一位为1的数,去减去所给的数,即可.这里减法要用高精度.

    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. char s[100005];
    15. vector<int>sub(vector<int>&a,vector<int> &b)
    16. {
    17. vector<int> c;
    18. for(int i = 0,t = 0; i < a.size(); i++){
    19. t = a[i] - t;
    20. if (i < b.size()) t -= b[i];
    21. c.push_back((t+10)%10);
    22. if (t < 0) t = 1;
    23. else t = 0;
    24. }
    25. while(c.size()>1&&c.back()==0) c.pop_back();
    26. return c;
    27. }
    28. void solve()
    29. {
    30. int n;
    31. cin>>n>>s+1;
    32. if (s[1] != '9')
    33. {
    34. for(int i=1;i<=n;i++)
    35. cout<<9-(s[i]-'0');
    36. cout<<'\n';
    37. }
    38. else
    39. {
    40. vector<int>a,b;
    41. for(int i=1;i<=n+1;i++)
    42. a.push_back(1);
    43. for(int i=n;i;i--)
    44. b.push_back(s[i]-'0');
    45. auto c=sub(a,b);
    46. for(int i=c.size()-1;i>=0;i--)
    47. cout<<c[i];
    48. cout<<'\n';
    49. }
    50. return ;
    51. }
    52. signed main()
    53. {
    54. int t;
    55. cin>>t;
    56. while(t--)
    57. solve();
    58. return 0;
    59. }

    C. Helping the Nature

    Problem - C - Codeforcesicon-default.png?t=M5H6https://codeforces.com/contest/1700/problem/C题意:给你一个数组,你可以选择1-i的元素将他们-1,也可以选择i-n的元素将他们-1,也可以将所有的都+1,问多少次之后可以把所有元素置为0.

    思路:看见区间操作,而且是c题,就想到从前缀和,差分入手.果不其然,当转换为差分是,这三个操作就改变了.第一个操作就变成了了sub[1]-1,sub[i+1]+1,第二个操作就是sub[i]-1,第三个就是sub[1]+1.那么就可以直接对着差分数组求值.当当前元素<0时,就采用第一个操作将其置为0.当>0时采用第二个操作.最后用第二个和第三个操作来处理sub[1]即可.

    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. int arr[200005];
    16. int sub[200005];
    17. void solve()
    18. {
    19. int ans=0,n;
    20. scanf("%lld",&n);
    21. for(int i=1;i<=n;i++)
    22. {
    23. scanf("%lld",&arr[i]);
    24. sub[i]=arr[i]-arr[i-1];
    25. }
    26. for(int i=2;i<=n;i++)
    27. {
    28. if(sub[i]<0)
    29. {
    30. sub[1]-=abs(sub[i]);
    31. ans+=abs(sub[i]);;
    32. }
    33. else
    34. ans+=sub[i];
    35. }
    36. ans+=abs(sub[1]);
    37. printf("%lld\n",ans);
    38. return ;
    39. }
    40. signed main()
    41. {
    42. int t;
    43. cin>>t;
    44. while(t--)
    45. solve();
    46. return 0;
    47. }

    D. River Locks

    Problem - D - Codeforcesqqicon-default.png?t=M5H6https://codeforces.com/contest/1700/problem/D题意:有n个水库,每个水库上面都可以有一个龙头防水,连续的水库也可以连着放水,每秒1升水.n赐询问,每次问在t秒把所有水库装满要开几个水龙头.

    思路:很妙的思维题.一开始就想到,直接拿总的水量除以时间,向上取整,就会得到需要几个水龙头把它装满.但是,要考虑一些情况,就是前几个水库必须要都花时间装满之后,才会流到下一个水库,就是说我们要考虑的是用前面所有水库都装满的时间去除以所给的时间,才能知道需要几个水龙头.所以我们要用每一个水库的前缀和去除以当前便利了的水库的个数,向上取整,这个数就是把当前遍历过的前几个水库装满所需要的的时间.为了保证装满所有水库,要去这个时间的max,如果小于这个max,就说明我可能到某个水库时还没有装满,水不会往下流.这个就是-1的情况,其余的用总水量除以时间向下取整即可.

    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. int x,sum[200005];
    15. void solve()
    16. {
    17. int n,q,maxx=-1;
    18. scanf("%lld",&n);
    19. for(int i=1;i<=n;i++)
    20. {
    21. scanf("%lld",&x);
    22. sum[i]=sum[i-1]+x;
    23. maxx=max(maxx,(sum[i]-1)/i+1);
    24. }
    25. scanf("%lld",&q);
    26. while(q--)
    27. {
    28. int y;
    29. scanf("%lld",&y);
    30. if(y<maxx)
    31. printf("-1\n");
    32. else
    33. printf("%lld\n",(sum[n]-1)/y+1);
    34. }
    35. return;
    36. }
    37. signed main()
    38. {
    39. solve();
    40. return 0;
    41. }

    加油!

  • 相关阅读:
    天池Python练习05-列表操作
    uView教程-骨架屏搭建 #低代码 #小程序 #uView
    Python 自动化教程(1) 概述,第一篇 Excel自动化首篇
    史上最简单,一篇学会Docker私有仓库Harbor的搭建
    hadoop 报不是内部或外部命令的解决办法
    python selenium参数详解和案例实现
    认识Tomcat
    如何使用Plotly和Dash进行数据可视化
    (附源码)php养老院管理系统 毕业设计 202026
    mysql高级刷题-01-求项目子任务分组计算
  • 原文地址:https://blog.csdn.net/qq_49593247/article/details/125429382