当前位置: 首页 > news >正文

2024昆明ICPC A. Two-star Contest(直观命名+详细注释)

Problem - A - Codeforces

思路:

按照等级排序,维护同等级最大评分,每个等级的总评分至少比其第前一个等级的最大评分大1分

吐槽:

思路不难,但坑好多,感觉全踩了一遍

坑:(按解决先后排序

要维护同等级的最大值,并且与前一等级的排序,不能只根据排完序后前一个的总评分进行判断

储存 -1 所在的位置,代替遍历查找,用空间换时间

题目要求按输入顺序输出各个比赛的评分,不要进行两次排序,不要格外用上离散化,充分利用好下标

不要用pair<int,vector<int> > 类型的数组排序,用pair对应起等级和下标就行

更新前驱不受是否需要填值影响

AC代码:

#include<bits/stdc++.h>
using namespace std;#define int long longbool cmp(pair<int,int> a,pair<int,int> b){return a.first<b.first;
}    //pair<int,int>装<等级,下标>,将等级小的排在前面int n,m,k;
int x; int cc;void solve(){cin>>n>>m>>k;pair<int,int> grade[n];  //装<等级,下标>,将每个竞赛的等级与其下标对应起来vector<int> score[n],location[n];    //储存每个竞赛的评分、其-1元素在score[]的位置map<int,int> mx;    //储存每个等级评分和的最大值for(int i=0;i<n;i++){cin>>grade[i].first; grade[i].second=i;    //输入等级,对应其下标int sum=0 , cnt=0;    //用于统计该竞赛当前评分和、-1元素的数量score[i].push_back(0);   //留出score[]的第一个位置用于存放该竞赛当前评分和for(int j=1;j<=m;j++){cin>>x;score[i].push_back(x);if(x==-1){cnt++;    //统计-1数量location[i].push_back(j);    //储存-1位置}else{sum+=x;    //统计评分和}}mx[grade[i].first] = max(mx[grade[i].first],sum);    //更新当前等级竞赛的最大评分和score[i][0]=sum;    //0号位存放评分和score[i].push_back(cnt);    //m+1号位存放-1的数量}sort(grade,grade+n);    //按等级进行排序int front = 0;    //记录 当前等级的 前一个等级 的 下标for(int i=1;i<n;i++){if(grade[i].first == grade[0].first) continue;    //跳过最低等级的竞赛int should = max(score[grade[i].second][0],mx[grade[front].first]+1);    //该竞赛的最小评分和应为max(该竞赛当前评分和,前一等级竞赛最大评分和+1)int difference = should-score[grade[i].second][0];    //记录should 与 当前竞赛评分和的差if(difference){    //如果差不为0,意味这要填分到-1所在的位置if(score[grade[i].second][m+1]*k<difference){cout<<"No"<<'\n'; return;}    //如果-1的个数*k 不足以填补 差 则输出No,直接判出for(int j=0;j<location[grade[i].second].size() && difference>0;j++){    //调出-1元素的位置,按差填值,填完结束cc = location[grade[i].second][j];if(difference>k){score[grade[i].second][cc]=k; score[grade[i].second][0]+=k; difference-=k;    //更新-1处的值,更新该竞赛评分和,更新差的值}else{score[grade[i].second][cc]=difference; score[grade[i].second][0]+=difference; difference-=difference;    //更新-1处的值,更新该竞赛评分和,更新差的值}}mx[grade[i].first] = max(mx[grade[i].first],score[grade[i].second][0]);    //更新当前等级最大评分和}if(grade[i].first != grade[i+1].first) front = i;    //如果当前竞赛的等级与其后面一个竞赛等级不同,则更新front,将当前竞赛的等级作为 前一个等级 (因为grade[]已经排序)(此行必须放在if(difference){}之外,就算当前等级竞赛的difference都为0,也必须更新front,不然到下一个等级的竞赛算should时会得到错误的值)}cout<<"Yes"<<'\n';    //一切安好就输出Yes(平凡即是喜乐(?)for(int i=0;i<n;i++){for(int j=1;j<=m;j++){if(score[i][j]==-1) cout<<0<<" ";    //还是-1的位置就输出0else cout<<score[i][j]<<" ";}cout<<"\n";}
}signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t;cin>>t;while(t--){solve();}return 0;
}

http://www.lryc.cn/news/470702.html

相关文章:

  • 【算法刷题指南】双指针
  • HTML,CSS,JavaScript三件套
  • react 总结+复习+应用加深
  • 关于 API
  • 第15次CCF CSP真题解
  • STM32硬件平台
  • 一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)
  • 【人工智能-初级】第6章 决策树和随机森林:浅显易懂的介绍及Python实践
  • 时间序列预测(九)——门控循环单元网络(GRU)
  • 李东生牵手通力股份IPO注册卡关,三年近10亿“清仓式分红”引关注
  • Android13、14特殊权限-应用安装权限适配
  • DMVPN协议
  • leetcode动态规划(十八)-零钱兑换II
  • 2024 CSP-J 题解
  • GPU 服务器厂家:中国加速计算服务器市场的前瞻洞察
  • Hadoop集群修改yarn队列
  • 【GPIO】2.ADC配置错误,还是能得到电压数据
  • css-元素居中方式
  • redis内存打满了怎么办?
  • 决策算法的技术分析
  • 【Python爬虫】获取汽车之家车型配置附代码(2024.10)
  • JVM 加载 class 文件的原理机制
  • NumPy学习第九课:字符串相关函数
  • 卷积神经网络(CNNs)在处理光谱特征的序列属性时表现不佳
  • 【IC】MCU的Tick和晶振频率
  • 从0到1学习node.js(npm)
  • 【STM32 Blue Pill编程实例】-OLED显示DS18B20传感器数据
  • STM32 从0开始系统学习3 启动流程
  • 交换机:端口安全与访问控制指南
  • 【C++ | 数据结构】八大常用排序算法详解