2021.01.28 Rating赛 | Codeforces Round #488 by NEAR (Div. 2) ABC
CodeForces - 994A
直接暴力做也可以,但是比较好的方法是,先把第一行的数据存下来,然后使用map将第二行的数据进行标记,这样遍历第一行的数据,如果被标记过就输出。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <map> 5 #include <string> 6 #define MAXN 100007 7 typedef long long ll; 8 9 using namespace std; 10 int m,n; 11 int a[100],b[100]; 12 map<int,int> mp; 13 int main(){ 14 cin>>n>>m; 15 for(int i =0;i<n;i++){ 16 cin>>a[i]; 17 } 18 19 for(int i =0;i<m;i++){ 20 int tmp; 21 cin>>tmp; 22 mp[tmp]=1; 23 } 24 25 int index=0; 26 for(int i =0;i<n;i++){ 27 if(mp[a[i]]){ 28 b[index++]=a[i]; 29 } 30 } 31 for(int i =0;i<index;i++){ 32 if(i==0){ 33 cout<<b[i]; 34 } 35 else{ 36 cout<<" "<<b[i]; 37 } 38 } 39 cout<<endl; 40 41 42 return 0; 43
CodeForces - 994B
比赛期间忘记使用优先队列,自己做的时候又忘记了k=0的情况导致一直WA11这个点。
#include <iostream> #include <algorithm> #include <cstring> #include <map> #include <string> #include <cstdio> #include <queue> #include <set> #define MAXN 100007 typedef long long ll; using namespace std; int n,k; struct book{ int power,coin,index; ll col; }g[MAXN]; bool cmp(book a,book b){ if(a.power==b.power) return a.coin<b.coin; return a.power<b.power; } bool cmp1(book a,book b){ return a.index<b.index; } int main(){ multiset<int, greater<int> > q; scanf("%d%d",&n,&k); for(int i =0;i<n;i++){ cin>>g[i].power; g[i].index=i; } for(int i =0;i<n;i++){ cin>>g[i].coin; g[i].col=g[i].coin; } sort(g,g+n,cmp); for(int i =0;i<n;i++){ int t=0; for(multiset<int, greater<int> >::iterator it=q.begin();it!=q.end();it++){ if(t==k) break; g[i].col+=*it; t++; } q.insert(g[i].coin); } sort(g,g+n,cmp1); for(int i =0;i<n;i++){ if(i!=0) cout<<" "; cout<<g[i].col; } cout<<endl; }
CodeForces - 994C
这个题需要将情况画出来,一种情况是2号的四个角中的一个或其中心点可能会存在于1号正方形内部,第二个情况是1号正方形的一个角存在2号的内部。
第一种情况我们可以判断一下这2号的五个点的x、y的值是否存在于1号的最大和最小的x、y之间。
第二种情况我们可以找到2号正方形的四个边的一次函数,因为k值为1或-1,所以b的值等于y-x或者y+x。这里我们需要判断的是1号正方形的四个角其中一个或者其中心点是被这些函数包围。
该题考的地方题目说的是暴力,但是数据大点要考的就是数学了。
#include <iostream> #include <algorithm> #include <cstring> #include <map> #include <string> #include <cstdio> #include <queue> #include <cmath> #include <set> #define MAXN 100007 typedef long long ll; using namespace std; int n,k; double ax[5],ay[5],axl=101,axb=-101,ayl=101,ayb=-101,acx,acy; double bx[5],by[5],bxl=101,bxb=-101,byl=101,byb=-101,bcx,bcy; int main(){ for(int i =0;i<4;i++){ cin>>ax[i]>>ay[i]; axl=min(axl,ax[i]); axb=max(axb,ax[i]); ayl=min(ayl,ay[i]); ayb=max(ayb,ay[i]); } for(int i =0;i<4;i++){ cin>>bx[i]>>by[i]; bxl=min(bxl,bx[i]); bxb=max(bxb,bx[i]); byl=min(byl,by[i]); byb=max(byb,by[i]); } ax[4]=(axl+axb)/2; ay[4]=(ayl+ayb)/2; bx[4]=(bxl+bxb)/2; by[4]=(byl+byb)/2; double le=(byb-byl); int flag=0; for(int i =0;i<5;i++){ if(bx[i]>=axl&&bx[i]<=axb&&by[i]>=ayl&&by[i]<=ayb){ flag=1; break; } double b1 = (byl+byb)/2 + bxl; double b2 = (byl+byb)/2 - bxb; double b3 = (byl+byb)/2 + bxb; double b4 = (byl+byb)/2 - bxl; if(ay[i]>=-1*ax[i]+b1&&ay[i]>=ax[i]+b2&&ay[i]<=-1*ax[i]+b3&&ay[i]<=ax[i]+b4){ flag=1; break; } } if(flag) printf("YES\n"); else printf("NO\n"); cout<<endl; }

浙公网安备 33010602011771号