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;
}

 

posted @ 2021-01-31 21:28  Leviathan_Sei  阅读(77)  评论(0)    收藏  举报