2021.01.28 Rating赛 解题/补题报告
A
用一个数组标记一下出现的数字,按顺序输出出现过的数字
#include<bits/stdc++.h> using namespace std; int main() { int n,m,a[20],b[20]={0},f=0,i,x; cin>>n>>m; for(i=0;i<n;i++){ cin>>a[i]; } for(i=0;i<m;i++){ cin>>x; b[x]=1; } for(i=0;i<n;i++){ if(f==0&&b[a[i]]==1){ cout<<a[i]; f=1; }else if(b[a[i]]==1){ cout<<" "<<a[i]; } } return 0; }
B
比赛的时候没理清楚( ‘-ωก̀ )
先按力量排序,力量最小的一个也打不过,结果就是他自己本来有的金钱,
算完的把金钱再放入set中,保证set中的力量都比这个小
其他的从set中找k个最大的,加在ans上
最后按id排序恢复原来的顺序,输出
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct people{ int id,p,c; ll ans; }a[100005];
/*
id 初始序号
p 力量
c 初始金钱
ans 结果(初始金钱
*/
bool cmp(people a,people b){ if(a.p==b.p){ return a.c<b.c; }else{ return a.p<b.p; } } bool cmp1(people a,people b){ return a.id<b.id; } int main() { int n,k,i; cin>>n>>k; for(i=0;i<n;i++){ cin>>a[i].p; } for(i=0;i<n;i++){ cin>>a[i].c; a[i].ans=a[i].c; a[i].id=i; } sort(a,a+n,cmp); multiset<int, greater<int> > s;//从大到小 for(i=0;i<n;i++){ int cnt=0; for(auto j: s){ if(cnt++>=k){ break; } a[i].ans+=j; } s.insert(a[i].c); } sort(a,a+n,cmp1); for(i=0;i<n;i++){ cout<<a[i].ans<<" "; } return 0; }
c
参考大佬代码( ‘-ωก̀ )
题意,两个正方形是否相交
题解:1.用叉积判断边是否相交
2.判断A的中心是否在B内或者B的中心是否在A内
#include<bits/stdc++.h> using namespace std; typedef long long ll; int x[3][5],y[3][5];//两个正方形的坐标(x,y) pair<int,int> p[3][4]; int cross(pair<int,int> a,pair<int,int> b,pair<int,int> c)//叉积 { return (b.first-a.first)*(c.second-a.second)-(c.first-a.first)*(b.second-a.second); } int ok(int i,int j) { int k; for(k=0; k<4; k++) { if (cross (p[i][0], p[i][1], p[j][k]) *cross (p[i][2], p[i][3], p[j][k]) >= 0 && cross (p[i][1], p[i][2], p[j][k]) *cross (p[i][3], p[i][0], p[j][k]) >= 0)//判断相交 { return 1; } } pair<int,int> px;//中心 px.first=(p[j][0].first + p[j][2].first) / 2; px.second=(p[j][1].second + p[j][3].second) / 2; if(cross (p[i][0], p[i][1], px) *cross (p[i][2], p[i][3], px) >= 0 && cross (p[i][1], p[i][2], px) *cross (p[i][3], p[i][0], px) >= 0) { return 1; } return 0; } int main() { int n,i; for(i=0;i<4;i++){ cin>>x[1][i]>>y[1][i]; p[1][i]=pair<int,int>(x[1][i],y[1][i]); } for(i=0;i<4;i++){ cin>>x[2][i]>>y[2][i]; p[2][i]=pair<int,int>(x[2][i],y[2][i]); } if(ok(1,2)==0&&ok(2,1)==0){ cout<<"NO"<<endl; }else{ cout<<"YES"<<endl; } return 0; }