欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 2024昆明ICPC A. Two-star Contest(直观命名+详细注释)

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

2024/10/25 15:07:25 来源:https://blog.csdn.net/qq_39804992/article/details/143218766  浏览:    关键词: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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com