前言
緊張的期末考試結束了,過了幾天奢靡的寒假生活後無聊到又回來做題啦
(好像好久好久沒做ctf和acm了)
然後愉快的刷了一早上杭電十一頁,一切都是如此順暢的ac,直到我遇見了它,2021題。
然後想一口吃下全局,總在想怎麼從總工資裏分出總張數。。果然我是隻菜狗。
百度了下wp,發現用到了貪心算法,名字挺有趣的,於是決定把它學了再說!
開肝!
———————————————————————————————————
補充養分
首先要學貪心,推薦
https://baijiahao.baidu.com/s?id=1642122740570394361&wfr=spider&for=pc
強烈安利!
強烈安利!
強烈安利!
三步走輕鬆瞭解貪心
貪心算法的三步走!
第一步
明確到底什麼是最優解?明確下來之後用小本本記下來!
第二步
明確什麼是子問題的最優解?再用小本本記下來!
第三步
分別求出子問題的最優解再堆疊出全局最優解?這步不用記!
就是這麼簡單!
然後。。。然後我就莫名其妙看會了。神了。
反過來看那道題2021,那麼應該就是把每一個老師貪心了即可
–——————————————————————————————————
分析(杭電oj 2021題)
首先,每個老師的工資應當是獨立的。總不可能一個老師三塊錢,另一個老師兩塊錢,你準備一張五塊錢這樣子。很明顯是無法將總工資合在一起的,所以每個老師的工資自然要分別計算。而根據貪心算法,我只追求眼前的利益,只把眼前每個老師的工資算出最優解然後合計應該就是全局最優解了。每個老師的最優解是這麼考慮的:很簡單,面值大張數少。。1張100總比100張1塊來的爽快= =
所以就一個個除下來,然後從大到小統計個數。
然後覺得太麻煩了,於是就照着網上簡單的方法列出數組,然後用for遍歷,果真方便!
附上代碼
#include<stdio.h>
int fix[6]={100,50,10,5,2,1};
int a[105];
int sum;
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<6;j++)
{
sum+=a[i]/fix[j];
a[i]%=fix[j];
}
}
printf("%d\n",sum);
}
return 0;
}
代碼 code by this
以後遇上貪心再補充吧,的確這道題的貪心算法過於簡單了= =