• Codeforces Round 953 (Div. 2) A - C 题解


    因为有事只做了A-C,都比较简单,全是很简单的思维,明天有空还会添加上D,如果有人需要可以明天常来看看!

    进入正题:

    A. Alice and Books

    题意:给你n个数字,将这些数字分到两堆里,每个堆取一个编号最上面的数字,问能取到的最大和是多少?
    题解:其实很容易看出来,最后一个数字是必须取的,那么直接用前n-1个数字的最大值加上最后一个值求和即可。
    代码:
    1. #include
    2. using namespace std ;
    3. typedef long long ll ;
    4. const int maxn = 1e6 + 7 ;
    5. inline ll read(){
    6. ll x = 0 , f = 1 ;
    7. char c = getchar() ;
    8. while(c > '9' || c < '0'){
    9. if(c == '-')
    10. f = -1 ;
    11. c = getchar() ;
    12. }
    13. while(c >= '0' && c <= '9'){
    14. x = x * 10 + c - '0' ;
    15. c = getchar() ;
    16. }
    17. return x * f ;
    18. }
    19. ll t , n , m , k , a[maxn] ;
    20. void solve(){
    21. n = read() ;
    22. for(int i = 1 ; i <= n ; i ++){
    23. a[i] = read() ;
    24. }
    25. ll Max = -1 ;
    26. for(int i = 1 ; i <= n - 1 ; i ++){
    27. Max = max(Max , a[i]) ;
    28. }
    29. cout << Max + a[n] << endl ;
    30. }
    31. int main(){
    32. t = read() ;
    33. while(t --){
    34. solve() ;
    35. }
    36. return 0 ;
    37. }

    B. New Bakery

    题意:给你三个数字n,a,b,可以选择一个k,在1<=i<=k" role="presentation" style="position: relative;">1<=i<=k内,每次可以增加(bi+1)" role="presentation" style="position: relative;">(bi+1)个硬币,剩下的(n-k)个数字,每个加上a,问能取到的最大值是多少?
    题解:很明显,当bi+1<=a" role="presentation" style="position: relative;">bi+1<=a,就用a即可,直接列式子,出答案即可。
    代码:
    1. #include
    2. using namespace std ;
    3. typedef long long ll ;
    4. const int maxn = 1e6 + 7 ;
    5. inline ll read(){
    6. ll x = 0 , f = 1 ;
    7. char c = getchar() ;
    8. while(c > '9' || c < '0'){
    9. if(c == '-')
    10. f = -1 ;
    11. c = getchar() ;
    12. }
    13. while(c >= '0' && c <= '9'){
    14. x = x * 10 + c - '0' ;
    15. c = getchar() ;
    16. }
    17. return x * f ;
    18. }
    19. ll t , n , m , k , a[maxn] ;
    20. void solve(){
    21. n = read() ;
    22. m = read() ;
    23. k = read() ;
    24. if(m >= k){
    25. cout << m * n << endl ;
    26. return ;
    27. }
    28. else{
    29. ll res = k - m + 1 ;
    30. if(res > n){
    31. res = n ;
    32. }
    33. // cout << min(n , k - m + 1) << endl ;
    34. cout << (((k - res + 1ll + k) * res) / 2ll) + max(0ll , (n - res)) * m << endl ;
    35. }
    36. }
    37. int main(){
    38. t = read() ;
    39. while(t --){
    40. solve() ;
    41. }
    42. return 0 ;
    43. }

    C. Manhattan Permutations

    题意:给你一个定义曼哈顿价值,表示为|a11|+|a22|+....+|ann|" role="presentation" style="position: relative;">|a11|+|a22|+....+|ann|,问找到一个最大的排列,能满足曼哈顿价值等于k,如果没法满足,输出NO。
    题解:首先,交换两个数字,很明显不会出现奇数的情况,再看,如果交换三个数字,例如135,其实和交换15的价值是一样的,那么很明显,每次交换两个数字即可。交换总会有数据范围,因为是排列,肯定是倒序和正序碰到一起的时候是最大值,这样NO的情况就排除完了。再来看可以的情况,我们手模数据,会发现,交换(1,2)和交换(1,3)价值差2,每次都差2,那么第一次交换的最大值就是(1,n),第二次就是(2,n-1)....,所以我们就用贪心,看看减到什么时候会小于0,最后再交换(l,(m/2)+l)即可,完美撒花!复杂度O(n/2)" role="presentation" style="position: relative;">O(n/2)
    代码:
    1. #include
    2. using namespace std ;
    3. typedef long long ll ;
    4. const int maxn = 1e6 + 7 ;
    5. inline ll read(){
    6. ll x = 0 , f = 1 ;
    7. char c = getchar() ;
    8. while(c > '9' || c < '0'){
    9. if(c == '-')
    10. f = -1 ;
    11. c = getchar() ;
    12. }
    13. while(c >= '0' && c <= '9'){
    14. x = x * 10 + c - '0' ;
    15. c = getchar() ;
    16. }
    17. return x * f ;
    18. }
    19. ll t , n , m , k , a[maxn] ;
    20. void solve(){
    21. n = read() ;
    22. m = read() ;
    23. ll ans = 0 ;
    24. if(n % 2 == 1){
    25. ans += ((2ll + 2 * (n / 2)) * (n / 2)) ;
    26. }
    27. else{
    28. ans += ((1ll + (2 * (n / 2) - 1))) * (n / 2) ;
    29. }
    30. if(m > ans || m % 2 == 1){
    31. cout << "NO\n" ;
    32. return ;
    33. }
    34. else{
    35. for(int i = 1 ; i <= n ; i ++){
    36. a[i] = i ;
    37. }
    38. ll rt = (n - 1) * 2 ;
    39. ll l = 1 , r = n ;
    40. while(m > 0){
    41. if(m - rt >= 0){
    42. swap(a[l] , a[r]) ;
    43. m -= rt ;
    44. l ++ ;
    45. r -- ;
    46. rt -= 4 ;
    47. }
    48. else{
    49. ll Rt = (m / 2) + l ;
    50. swap(a[l] , a[Rt]) ;
    51. m = 0 ;
    52. }
    53. }
    54. }
    55. cout << "YES\n" ;
    56. for(int i = 1 ; i <= n ; i ++){
    57. cout << a[i] << " " ;
    58. }
    59. cout << endl ;
    60. }
    61. int main(){
    62. t = read() ;
    63. while(t --){
    64. solve() ;
    65. }
    66. return 0 ;
    67. }

    喜欢作者的记得点上你们宝贵的关注哦~

  • 相关阅读:
    你好,法语!A2知识点总结(1)
    详解Unity中的Nav Mesh新特性|导航寻路系统 (二)
    阿里EasyExcel动态头模板下载,以及下拉框设置
    有道翻译调用
    使用vue-cli搭建SPA项目
    【已解决】使用Appium Inspector及uiautomatorviewer无法定位浮窗内元素
    I2S/PCM接口及音频codec
    JavaWeb---实验课---第8章 EL-JSTL
    CUDA学习笔记3——图像卷积实现
    安装 hbase(伪分布式)
  • 原文地址:https://blog.csdn.net/m0_63322121/article/details/139724123