2021.1.28 个人rating赛补题报告

A. Fingerprints

题解:就是给定2个序列,在第二个序列中判断第一个序列是否存在这个数,然后按第一个序列的顺序输出就好

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
 
int main()
{
    int n, m;
    int seq[20];
    int ans[20];
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &seq[i]);
    }
    for (int j = 0, temp; j<m; j++)
    {
        scanf("%d", &temp);
        for (int i = 0; i < n; i++)
        {
            if (seq[i] == temp)
            {
                ans[i] = 1;
                break;
            }
        }
    }
    for (int i = 0; i<n; i++)
    {
        if (ans[i] == 1)
        {
            printf("%d ", seq[i]);
        }
    }
    printf("
");
    return 0;
}

B. Knights of a Polygonal Table

题意:有n个骑士,每个骑士能杀死比他战斗力低的骑士,且最多能杀死k个,问这个骑士最多能杀死谁得到多少金币。

题解:使用结构体存储骑士的金币和战斗力,然后这题所有变量很明显是k最小,我的做法就是先按武力值排个序,这样所有在第i个骑士前面的武士都可以被杀掉,然后只需要动态维护前面所有的武士的钱的前k大即可,用一个堆就搞定了

堆可以直接用priority_queue

代码:

#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
#define int long long
using namespace std;
const int maxn=1e5+5;
int n,k;
struct node
{
    int p,c,ans,id;
}a[maxn];
priority_queue<int> q;
vector<int> v;
bool cmp(node a,node b)
{
    return a.p<b.p;
}
bool cmp1(node a,node b)
{
    return a.id<b.id;
}
signed main()
{
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i].p);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i].c);
        a[i].ans=a[i].c;
        a[i].id=i;
    }
    sort(a+1,a+n+1,cmp);
    q.push(a[1].c);
    for(int i=2;i<=n;i++)
    {
        int s=q.size();
        int t=min(k,s);
        for(int j=1;j<=t;j++)
        {
            int x=q.top();
            q.pop();
            v.push_back(x);
        }
        for(int j=0;j<v.size();j++)
        {
            a[i].ans+=v[j];
            q.push(v[j]);
        }
        v.clear();
        q.push(a[i].c);
    }
    sort(a+1,a+n+1,cmp1);
    for(int i=1;i<=n;i++)
        printf("%lld ",a[i].ans);
    return 0;
}
原文地址:https://www.cnblogs.com/liyongqi/p/14382110.html