当前位置:   article > 正文

Codeforces Round 965 (Div. 2) (个人题解)(待补全)

Codeforces Round 965 (Div. 2) (个人题解)(待补全)

前言:

今天晚上打的cf,只能说我还是太菜了,只会前两道签到题,第三题自己有一点思路但苦于时间不太够没能调出来,已经很晚了,明早还有事,我就先把写出来的题放在这,如果之后有补出来的题我再来更新吧!;

正文:

网址:Dashboard - Codeforces Round 965 (Div. 2) - Codeforces

A. Find K Distinct Points with Fixed Center:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. int t;
  5. cin>>t;
  6. while(t--){
  7. int x,y,k;
  8. scanf("%d%d%d",&x,&y,&k);
  9. if(k%2){
  10. cout<<x<<" "<<y<<endl;
  11. int r=(k-1)/2;
  12. for(int i=1;i<=r;i++){
  13. cout<<x+i<<" "<<y+i<<endl;
  14. cout<<x-i<<" "<<y-i<<endl;
  15. }
  16. }
  17. else{
  18. int r=k/2;
  19. for(int i=1;i<=r;i++){
  20. cout<<x+i<<" "<<y+i<<endl;
  21. cout<<x-i<<" "<<y-i<<endl;
  22. }
  23. }
  24. }
  25. return 0;
  26. }

根据中点找k个不同的其他点,我们直接在直角坐标中求斜率为1的线的对称点即可。

B. Minimize Equal Sum Subarrays:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[200005];
  4. int main(){
  5. int t;
  6. cin>>t;
  7. while(t--){
  8. int n;
  9. scanf("%d",&n);
  10. for(int i=1;i<=n;i++){
  11. scanf("%d",&a[i]);
  12. }
  13. for(int i=2;i<=n;i++){
  14. printf("%d ",a[i]);
  15. }
  16. printf("%d\n",a[1]);
  17. }
  18. return 0;
  19. }

将每个数往前移动一位输出即可。

C. Perform Operations to Maximize Score:

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. typedef long long ll;
  4. const int N=2e5+5;
  5. using namespace std;
  6. struct Point {
  7. int x; // 数组元素
  8. int y; // 二进制标记,表示是否可以选择该元素进行增加操作
  9. };
  10. bool operator<(const Point& a, const Point& b) {
  11. return a.x < b.x || (a.x == b.x && a.y < b.y);
  12. }
  13. void solve(){
  14. int n,k;
  15. scanf("%lld%lld",&n,&k);
  16. vector<Point> a(n + 1);
  17. for(int i=1;i<=n;i++)scanf("%lld",&a[i].x);
  18. for(int i=1;i<=n;i++)scanf("%lld",&a[i].y);
  19. sort(a.begin()+1,a.end());
  20. int ans=a[n/2].x+a[n].x;
  21. int tmp=0;
  22. if(a[n].y==1){
  23. printf("%lld\n",ans+k);
  24. return;
  25. }
  26. for(int i=n;i>=1;i--){
  27. if(a[i].y){
  28. tmp=i;
  29. break;
  30. }
  31. }
  32. int l=a[n/2].x,r=l+k;
  33. while(l<=r){
  34. int mid=(l+r)>>1;
  35. int all=n,cost=k;
  36. for(int i=n;i>0&&all>=n/2;i--){
  37. if(a[i].x<mid&&a[i].y){
  38. if(a[i].x+cost>=mid){
  39. cost-=mid-a[i].x;
  40. all--;
  41. }
  42. }
  43. if(a[i].x>=mid){
  44. all--;
  45. }
  46. }
  47. if(all<n/2){
  48. l=mid+1;
  49. ans=max(ans,mid+a[n].x);
  50. }
  51. else{
  52. r=mid-1;
  53. }
  54. }
  55. a[tmp].x+=k;
  56. sort(a.begin()+1,a.end());
  57. ans=max(ans,a[n/2].x+a[n].x);
  58. printf("%lld\n",ans);
  59. }
  60. signed main(){
  61. int t;
  62. cin>>t;
  63. while(t--){
  64. solve();
  65. }
  66. return 0;
  67. }

题目大意是指可以对b[i]=1的数进行加1操作k次,问能得到的数组最大值和中位数的和的最大值为多少,只有两种操作思路,要么使a[n/2]最大,要么使a[n]最大。可以分别进行两种操作,最后令ans取max。易知当最大值a[n]可以操作时,将k全部加到最大值a[n]上,此时k全部有贡献,ans直接为最大ans。否则将最大可操作的值加满。中位数情况要保证中位数尽可能变大,这就要注意中位数在变大过程中可能会改变,所以我们得一直对当前的中位数操作,我们可以用二分来判断最后的中位数是多少(需要加多少),再判断此情况是否合理来更新最大值即可。

后记:

   前两道题23分钟就写完了,后面的时间直接就开始坐牢了,果然做的题还是太少了啊

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号