韜韜搶蘋果 #普及組#

又到了收獲的季節(jié),樹上結(jié)了許多韜韜,錯(cuò)了,是許多蘋果,有很多個(gè)小韜韜都來摘蘋果。每個(gè)韜韜都想要最大的蘋果,所以發(fā)生了爭(zhēng)執(zhí),為了解決他們的矛盾,出題人定了一項(xiàng)特殊的規(guī)則,按體重的大小來定順序,每一輪都是先由胖的先摘(照顧胖子),每個(gè)韜韜都是很聰明的,不會(huì)錯(cuò)過眼前最大的蘋果?,F(xiàn)在問題來了,一共有n個(gè)蘋果,m個(gè)韜韜,要你按原順序輸出每個(gè)韜韜可以搶到的蘋果的總大小。

Input

第一行兩個(gè)數(shù)n,m。

接下來一行n個(gè)數(shù),分別為每個(gè)蘋果的大小。

接下來一行m個(gè)數(shù),分別為每個(gè)韜韜的體重。

Output

一行m個(gè)數(shù),每個(gè)韜韜搶到的蘋果的大小。

Sample Input

5 3

1 2 3 4 5

1 2 3

Sample Output

3 5 7

[數(shù)據(jù)規(guī)模]

n,m<=100000

思路

這一題,乍一看題目,"啊好水啊".可是嘞......

雖然看起來很水,但不過我寫的代碼比"韜韜摘蘋果"的多了去了.先說咋做吧.

1.輸入

輸入就不用說了,但是這里面需要把"肥韜韜"走一個(gè)結(jié)構(gòu)體,輸入的代碼如下

scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
    scanf("%d", &apple[i]);//蘋果
?
for(int i = 1; i <= m; i++)
{
    scanf("%d", &t[i].w);//輸入韜韜的重量
    t[i].l = i;//記錄編號(hào)
}

2.排序

題目表述的非常的清楚,我們要將韜韜按肥瘦排序,因?yàn)?00000不算大,sort過一遍即可.

int cmp(node a, node b)//按重量關(guān)鍵字排序
{
    return a.w > b.w;//大到小
}
{
...//其他代碼
}
sort(t + 1, t + m + 1, cmp);//這是排序的函數(shù)
sort(apple + 1, apple + 1 + n);//蘋果也順便π下

3.存答案

這一步也十分的牛13,額.

首先將蘋果從n到1過一遍,然后韜韜按照之前預(yù)處理好的宅蘋果.

int k = n;//k枚舉apple
int i = 1;//i枚舉韜韜
while(k != 0)
{
    t[i].c += apple[k];//記錄累加
    k--;//蘋果被宅
    i++;//掄到下一個(gè)韜韜
    if(i > m)//掄玩一遍
        i = 1;//再輪一遍
}

4.輸出

輸出就美麗啦,但是他是按編號(hào)輸出的,現(xiàn)在的復(fù)雜度有點(diǎn)堪憂,算啦,管他,再拍一遍.

int cmp2(node a, node b)
{
    return a.l < b.l;//按編號(hào)排
}
{
    ...//其他
}
sort(t + 1, t + m + 1, cmp2);
for(i = 1; i <= m; i++)
{
    printf("%d ", t[i].c);//拍完后輸出
}

嚕嚕嚕,這題就解決了,貼整體代碼:

#include <cstdio>
#include <algorithm>
using namespace std;
int n, m;
int apple[100001];
struct node {
    int l;
    int w;
    int c;
}t[100001];
int cmp(node a, node b)
{
    return a.w > b.w;
}
int cmp2(node a, node b)
{
    return a.l < b.l;
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++)
        scanf("%d", &apple[i]); 
    
    for(int i = 1; i <= m; i++)
    {
        scanf("%d", &t[i].w);
        t[i].l = i;
    }
    sort(t + 1, t + m + 1, cmp);
    sort(apple + 1, apple + 1 + n);
    int k = n;
    int i = 1;
    while(k != 0)
    {
        t[i].c += apple[k];
        k--;
        i++;
        if(i > m)
            i = 1;
    }
    sort(t + 1, t + m + 1, cmp2);
    for(i = 1; i <= m; i++)
    {
        printf("%d ", t[i].c);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容