韬韬抢苹果 #普及组#

Posted wnfs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了韬韬抢苹果 #普及组#相关的知识,希望对你有一定的参考价值。

Problem Description

又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹果。每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了一项特殊的规则,按体重的大小来定顺序,每一轮都是先由胖的先摘(照顾胖子),每个韬韬都是很聪明的,不会错过眼前最大的苹果。现在问题来了,一共有n个苹果,m个韬韬,要你按原顺序输出每个韬韬可以抢到的苹果的总大小。

Input

第一行两个数n,m。

接下来一行n个数,分别为每个苹果的大小。

接下来一行m个数,分别为每个韬韬的体重。

Output

一行m个数,每个韬韬抢到的苹果的大小。

Sample Input

5 3

1 2 3 4 5

1 2 3

Sample Output

3 5 7

[数据规模]

n,m<=100000

思路

这一题,乍一看题目,"啊~好水啊~".可是嘞......

虽然看起来很水,但不过我写的代码比"韬韬摘苹果"的多了去了.先说咋做吧.

1.输入

输入就不用说了,但是这里面需要把"肥韬韬"走一个结构体,输入的代码如下

1 scanf("%d%d", &n, &m);
2 for(int i = 1; i <= n; i++)
3     scanf("%d", &apple[i]);//苹果
4 ?
5 for(int i = 1; i <= m; i++)
6 
7     scanf("%d", &t[i].w);//输入韬韬的重量
8     t[i].l = i;//记录编号
9 

2.排序

题目表述的非常的清楚,我们要将韬韬按肥瘦排序,因为100000不算大,sort过一遍即可.

1 int cmp(node a, node b)//按重量关键字排序
2 
3     return a.w > b.w;//大到小
4 
5 
6 ...//其他代码
7 
8 sort(t + 1, t + m + 1, cmp);//这是排序的函数
9 sort(apple + 1, apple + 1 + n);//苹果也顺便π下

3.存答案

这一步也十分的牛13,额.

首先将苹果从n到1过一遍,然后韬韬按照之前预处理好的宅苹果.

 1 int k = n;//k枚举apple
 2 int i = 1;//i枚举韬韬
 3 while(k != 0)
 4 
 5     t[i].c += apple[k];//记录累加
 6     k--;//苹果被宅
 7     i++;//抡到下一个韬韬
 8     if(i > m)//抡玩一遍
 9         i = 1;//再轮一遍
10 

4.输出

输出就美丽啦,但是他是按编号输出的,现在的复杂度有点堪忧,算啦,管他,再拍一遍.

 1 int cmp2(node a, node b)
 2 
 3     return a.l < b.l;//按编号排
 4 
 5 
 6     ...//其他
 7 
 8 sort(t + 1, t + m + 1, cmp2);
 9 for(i = 1; i <= m; i++)
10 
11     printf("%d ", t[i].c);//拍完后输出
12 

噜噜噜,这题就解决了,贴整体代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 int n, m;
 5 int apple[100001];
 6 struct node 
 7     int l;
 8     int w;
 9     int c;
10 t[100001];
11 int cmp(node a, node b)
12 
13     return a.w > b.w;
14 
15 int cmp2(node a, node b)
16 
17     return a.l < b.l;
18 
19 int main()
20 
21     scanf("%d%d", &n, &m);
22     for(int i = 1; i <= n; i++)
23         scanf("%d", &apple[i]); 
24     
25     for(int i = 1; i <= m; i++)
26     
27         scanf("%d", &t[i].w);
28         t[i].l = i;
29     
30     sort(t + 1, t + m + 1, cmp);
31     sort(apple + 1, apple + 1 + n);
32     int k = n;
33     int i = 1;
34     while(k != 0)
35     
36         t[i].c += apple[k];
37         k--;
38         i++;
39         if(i > m)
40             i = 1;
41     
42     sort(t + 1, t + m + 1, cmp2);
43     for(i = 1; i <= m; i++)
44     
45         printf("%d ", t[i].c);
46     
47 

奶思~马飞~~...

 

以上是关于韬韬抢苹果 #普及组#的主要内容,如果未能解决你的问题,请参考以下文章

noip普及组2005 陶陶摘苹果

noip2006普及组测评数据

Noip2005普及组 陶陶摘苹果

暑假第四次考试 冲刺Noip模拟赛4 解题报告——五十岚芒果酱

[NOIP2005] 普及组 循环

急求NOIP2009普及组试题