Codeforces 446B DZY Loves Modification

举报
Linux猿 发表于 2021/08/05 01:13:46 2021/08/05
【摘要】 题目链接~~> 解题思路:                 首先,要把行列分开处理,假设选择 i 次行 , k - i 次列 ,如果先选行 ,那么当选择列时每选择一次列就减去 i*p ,选择 k - i 次列就减去 i * (k - i ) * p ,所以我们可以先单独处理行,然后单独处...

题目链接~~>

解题思路:

                首先,要把行列分开处理,假设选择 i 次行 , k - i 次列 ,如果先选行 ,那么当选择列时每选择一次列就减去 i*p ,选择 k - i 次列就减去 i * (k - i ) * p ,所以我们可以先单独处理行,然后单独处理列,最后只要减去 i * (k - i ) * p 即可。

代码:


  
  1. #include<iostream>
  2. #include<fstream>
  3. #include<iomanip>
  4. #include<ctime>
  5. #include<fstream>
  6. #include<sstream>
  7. #include<stack>
  8. #include<cstring>
  9. #include<cmath>
  10. #include<map>
  11. #include<queue>
  12. #include<vector>
  13. #include<cstdio>
  14. #include<algorithm>
  15. #define INT __int64
  16. using namespace std ;
  17. const double esp = 0.00000001 ;
  18. const INT INF = 9999999 ;
  19. const INT mod = 1e9 + 7 ;
  20. const INT MY = 200 + 10 ;
  21. const INT MX = 1000 + 10 ;
  22. INT n ,m , p ,k ;
  23. priority_queue<INT>row ,col ;
  24. INT a[MX] ,b[MX] ,R[MX*MX] ,L[MX*MX] ;
  25. void input()
  26. {
  27. INT x ;
  28. memset(a ,0 ,sizeof(a)) ;
  29. memset(b ,0 ,sizeof(b)) ;
  30. for(INT i = 0 ;i < n ; ++i)
  31. for(INT j = 0 ;j < m ; ++j)
  32. {
  33. scanf("%I64d" ,&x) ;
  34. a[i] += x ;
  35. b[j] += x ;
  36. }
  37. while(!row.empty())
  38. row.pop() ;
  39. while(!col.empty())
  40. col.pop() ;
  41. for(INT i = 0 ;i < n ; ++i)
  42. row.push(a[i]) ;
  43. for(INT i = 0 ;i < m ; ++i)
  44. col.push(b[i]) ;
  45. }
  46. void solve()
  47. {
  48. INT temp ;
  49. memset(R ,0 ,sizeof(R)) ;
  50. memset(L ,0 ,sizeof(L)) ;
  51. for(INT i = 1 ;i <= k ; ++i)
  52. {
  53. temp = row.top() ;
  54. row.pop() ;
  55. R[i] += temp + R[i-1] ;
  56. row.push(temp - p*m) ;
  57. }
  58. for(INT i = 1 ;i <= k ; ++i)
  59. {
  60. temp = col.top() ;
  61. col.pop() ;
  62. L[i] += temp + L[i-1] ;
  63. col.push(temp - p*n) ;
  64. }
  65. INT ans = L[k] ;
  66. for(INT i = 1 ;i <= k ; ++i)
  67. ans = max(ans ,R[i] + L[k-i] - i*(k-i)*p) ;
  68. cout<<ans<<endl ;
  69. }
  70. int main()
  71. {
  72. while(~scanf("%I64d%I64d%I64d%I64d" ,&n ,&m ,&k ,&p))
  73. {
  74. input() ;
  75. solve() ;
  76. }
  77. return 0 ;
  78. }


文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/38816387

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。