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

 

posted @ 2021-02-04 15:44  一只幽灵飘过  阅读(89)  评论(0编辑  收藏  举报