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