韬韬抢苹果 #普及组#

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 }

奶思~马飞~~...

 

转载于:https://www.cnblogs.com/wnfs/p/11516100.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值