1. 程式人生 > >學姐出的毒奶題之yjj

學姐出的毒奶題之yjj

pri 請問 main 一道 。。 影響力 name 幫助 如果

【寫在前面】——在調試了n遍代碼之後,終於自己給自己解了毒,也終於可以開始更新我的第一篇博文

【再說幾句】——OpenSnow巨佬的影響力非常廣泛,在她的帶動下,我也決定改題!哈哈哈~,但由於我比較懶,就不粘原題了,直接改嘍。

【開始正經】

<題目背景>

眾所周知,可愛的喬治是一位能吃的小豬,他經常會把看好的吃的加進自己的購物車裏面。而他還小,沒有多少零花錢,不舍得吃特別貴的事物。

<題目描述>

就在這時,喬治的姐姐佩奇想要幫助喬治。如果幫喬治買一次事物(即購物車食物的非空子集),佩奇可以得到這次購買食物的最大價值的錢(佩奇也是為了賺點零花錢),而要花費的代價是這次所購買的食物價值的平均值。

喬治因為有了佩奇的幫助,變的越來越貪婪(事實上可愛的喬治才不會這樣,都怪這個毒奶的題目),所以每次往購物車裏加的東西都會不比購物車中的任何物品價值低。

佩奇想要得到最多的錢,請問她購買一次事物能得到的最大價值是多少(即佩奇當前可以賺的最多零花錢是多少)?

<輸入輸出格式>

輸入格式

第一行有一個整數n,表示操作次數。

第1~n+1行,每行有一個操作類型:如果為1,則還有一個數k,表示喬治這次加入購物車的食物的價值;如果為2,表示佩奇想知道當前的最大收益。

輸出格式

對於每一個2操作,輸出1行1個4位浮點數,表示當前的最大收益。答案四舍五入。

輸入輸出樣例

技術分享圖片

技術分享圖片

數據範圍

對於5%的數據,保證和樣例一模一樣

對於30%的數據,保證n<=2000

對於100%的數據,保證n<=500000

【先粘代碼】

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
struct node
{
int a,k;
}t[50005];
int main()
{
//freopen("yjj.in","r",stdin);
//freopen("yjj.out","w",stdout);
int n;
double ave,wei,sum = 2,li; //因為每次都先算好兩個食物的平均數,因此sum一開始就為2
scanf("%d",&n);
for(int i = 2;i <= n + 1;i++)
{
  scanf("%d",&t[i - 1].a);
  if(t[i - 1].a == 1) scanf("%d",&t[i - 1].k);
 }
for(int i = 1;i <= n;i++)
 {
  if(t[i].a == 1) continue;//如果是1操作,則繼續
  else if(t[i].a == 2)//如果是2操作
  {
    wei = t[1].k + t[i - 1].k;//先算出第一個食物和這個2操作之前內個食物的總價
    ave = wei / sum;//求出兩個食物的平均價格
    for(int j = 2;j < i - 1;j++)//從第二個食物開始枚舉,枚舉到倒數第二個食物
    {
      if(t[j].a == 1 && t[j].k < ave)//如果枚舉的當前食物的價格比之前所求的平均值小
      {
        wei += t[j].k;//就買它
        sum++;//食物總數累加1
        ave = wei / sum;//求出當前平均值,為下一次比較做準備
      }
    }
      li = t[i - 1].k - ave;//佩奇的收益
      printf("%.4lf\n",li);

  }
  return 0;
}

【胡亂分析】

瑞拉我(對,就是我)做這道題的時候,沒有註意到“非空子集”這四個字,導致佩奇把所有食物都買了,然後求收益。這樣導致樣例1過了樣例2就過不了,於是各種改double、int,然後樣例2過了樣例1又過不了。。。後來經學姐的指點,和被自己的毒氣快要擊斃的時候,寫對了代碼。。。

那麽這道題怎麽做呢?首先,關註的點不應該是四舍五入(它好像會自己四舍五入),而是非空子集上,佩奇並不是傻到把所有食物都買,所以這是一道貪心題。讀入數據完畢後,先不著急算,開始進入一個循環,直到遇到2操作,然後把第一個食物和最後一個食物的價值加起來,再取平均值,因為這兩個食物肯定是要選的(一個最大,一個最小),接下來從第2個食物開始枚舉,一直到倒數第二個食物,其中,如果枚舉到的食物的價值比當前平均值小的話,就買了它,這樣它會拉低平均值(就像你拉低班級平均分。。額開個玩笑),這樣佩奇花的錢就少了,如果比當前平均值大,當然是不買了。這道題的思路就是這樣。

【orz】

如果哪個地方寫錯了,或者emmmm,還請大佬盡情鄙視我,要是能回復就更好了。(或者有沒有更簡短的代碼啥的)

學姐出的毒奶題之yjj