补题—Codeforces Round #346 (Div. 2) _智商欠费系列
这次的题目相对容易 但是智商依旧不够用
原因有三点 1.英文水平堪忧 2 逻辑不严密 3 细节掌握不够好
传送门
http://codeforces.com/contest/659
A 题目大意 圆环上有n个点 人从a位置出发 走b步 正负代表方向
(a+b%n+n)%n 需要特判 避免走到 0位置
观察数据范围 只需要(100*n+a+b-1)%n+1 还省去了特判
B 题目大意 有n个人的数据 m个地区 每个地区最少参赛2人 晋级2人
出线则输出 需要加赛 如第二个人和第三个人成绩一样 就输出?
#include<cstdio> #include<map> //#include<bits/stdc++.h> #include<vector> #include<stack> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<cstdlib> #include<climits> #define PI acos(-1.0) #define INF 0x3fffffff using namespace std; typedef long long ll; typedef __int64 int64; const ll mood=1e9+7; const int64 Mod=998244353; const double eps=1e-9; const int N=1e3+10; const int MAXN=200000; typedef int rl; inline void r(rl&num){ num=0;rl f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar(); num*=f; } typedef pair<string,int> psi; bool cmp(psi a,psi b) { return a.second>b.second; } int main() { vector<psi>v[10001]; int t; psi tem; int n,m; r(n),r(m); for(int i=0;i<n;i++) { cin>>tem.first; r(t);r(tem.second); v[t].push_back(tem); } for(int i=1;i<=m;++i) { if(v[i].size()<2) { putchar('?'); } else{ sort(v[i].begin(),v[i].end(),cmp); if(v[i][1].second==v[i][2].second) { putchar('?'); } else{ cout<<v[i][0].first<<' '<<v[i][1].first; } } putchar('\n'); } return 0; }
错误原因 未在判断第二个人和第三个成绩是否一样前判断 人数是否大于2
在(——人数等2 第二个人成绩为0的时候 第三个人不存在默认为0 则相等 输出?)因此wa
改完AC
#include<cstdio> #include<map> //#include<bits/stdc++.h> #include<vector> #include<stack> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<cstdlib> #include<climits> #define PI acos(-1.0) #define INF 0x3fffffff using namespace std; typedef long long ll; typedef __int64 int64; const ll mood=1e9+7; const int64 Mod=998244353; const double eps=1e-9; const int N=1e3+10; const int MAXN=1e4+10; typedef int rl; inline void r(rl&num){ num=0;rl f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar(); num*=f; } typedef pair<string,int> psi; bool cmp(psi a,psi b) { // if(a.second==b.second) return a.first<b.first; return a.second>b.second; } int main() { vector<psi>v[MAXN]; int t; psi tem; int n,m; r(n),r(m); for(int i=0;i<n;i++) { cin>>tem.first; r(t);r(tem.second); v[t].push_back(tem); } for(int i=1;i<=m;++i) { sort(v[i].begin(),v[i].end(),cmp); if(v[i].size()>2&&v[i][1].second==v[i][2].second) { putchar('?'); } else{ cout<<v[i][0].first<<' '<<v[i][1].first; } putchar('\n'); } return 0; }
这样写 还是不够好 我们注意到pair默认是先排一维从小到大然后二维依次
在输出的时候用pis 成绩*-1输入 ,成绩*-1从小到大即原成绩从大到小
就可以了
#include<bits/stdc++.h> using namespace std; const int MAX=1e5+9; int n,m,r,p; vector<pair<int,string> > mp[MAX]; string s; int main() { cin>>n>>m; for (int i=0;i<n;i++) cin>>s>>r>>p,mp[r].push_back({-p,s}); for (int i=1;i<=m;i++) { sort(mp[i].begin(),mp[i].end()); if (mp[i].size()>2 && mp[i][1].first==mp[i][2].first) cout<<"?\n"; else cout<<mp[i][0].second<<" "<<mp[i][1].second<<'\n'; } }
C 题目大意 找1-n序列中 未标记的和<m
开始用set瞎搞错误 姿势错误
可以开个vis数组 没意思 其实开vis是有问题的 可惜他的数据弱233
于是去学习了一下set的姿势
把存在的的插入 以后的扫描只有一趟 所以不用再次插入