10月3日备战Noip2018模拟赛3(B组)
T1 Apple韬韬抢苹果
题目描述
又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹果。每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了一项特殊的规则,按体重的大小来定顺序,每一轮都是先由胖的先摘(照顾胖子),每个韬韬都是很聪明的,不会错过眼前最大的苹果。现在问题来了,一共有ñ个苹果,米个韬韬,要你按原顺序输出每个韬韬可以抢到的苹果的总大小。
输入格式
apple.in
第一行两个数N,M。
接下来一行ñ个数,分别为每个苹果的大小。
接下来一行米个数,分别为每个韬韬的体重。
输出格式
apple.out
一行米个数,每个韬韬抢到的苹果的大小。
输入样例
5 3
1 2 3 4 5
1 2 3
输出样例
3 5 7
数据范围
N,M <= 100000
日常T1签到,真正的良心签到题啊
模拟水题,没什么说的,就是sort +模拟,直接上代码好了
(为什么这题我的代码格外长(╥╯^╰╥),模拟赛时也出现了巨佬的10多行代码)
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100005;
struct taotao{
int w;
int no;
int ap;
}t[N];
int n, m, i, j;
int a[N];
bool cmpw (taotao a, taotao b)
{
return a.w > b.w;
}
bool cmpn (taotao a, taotao b)
{
return a.no < b.no;
}
bool cmpa (int a, int b)
{
return a > b;
}
int main()
{
//freopen ("apple.in", "r", stdin);
//freopen ("apple.out", "w", stdout);
scanf ("%d %d", &n, &m);
for (i = 1; i <= n; i ++){
scanf ("%d", &a[i]);
}
for (i = 1; i <= m; i ++){
scanf ("%d", &t[i].w);
t[i].no = i;
}
sort (a + 1, a + 1 + n, cmpa);
sort (t + 1, t + 1 + m, cmpw); //排体重和苹果数
//for (i = 1; i <= n; i ++) printf ("%d ", a[i]);
//printf ("\n");
//for (i = 1; i <= m; i ++) printf ("%d ", t[i].w);
j = 1;
for (i = 1; i <= n; i ++){
t[j].ap += a[i];
//printf ("%d %d\n", j, t[j].ap);
if (j == m) j = 1;
else j ++; //一轮轮顺着拿
}
sort (t + 1, t + 1 + m, cmpn); //按序号排序后输出
for (i = 1; i <= m; i ++){
printf ("%d ", t[i].ap);
}
//fclose (stdin);
//fclose (stdout);
return 0;
}