題意:
有n種硬幣,每種硬幣有mi個,然後讓你給奶牛發工資,每週發至少c元(就是不找零錢的意思)然後問你能發幾周?(硬幣之間都是倍數關係)
思路:這個題目做了兩天,丟臉,看完這個題目我的第一反應就是從大的發起,就是先花面值大的,能大的就一直大的,只要不超過c,然後再能小的就一直小的,補全沒超過但是又不夠那一部分,這個想法一開始就是對的,只不過我寫的時候是排序,然後從前往後取,不能取了再從後往前取。。。這樣一直wa,後來無奈了 我看了下題解,臥槽,沒錯啊(這最蛋疼了,因為我敲題的錯誤思路和正確思路沒衝突,說不清..)結果就一直以為自己姿勢不對,然後不停的重新敲,優化優化優化。。還是wa,最後無奈了,直接找了個**看看,結果...哎! 說下正解吧、
#include#include#includeusing namespace std;
typedef struct
node;
node node[25];
bool camp(node a, node b)
int minn(int x ,int y)
int main ()
l = i;
while(1)
if(s > 0)
for(i = n ;i >= l ;i --)
}if(s > 0) break;
int t = 1000000000;
for(i = l ;i <= n ;i ++)
ans += t;
for(i = l ;i <= n ;i ++)
if(need[i]) node[i].b -= t * need[i];
}printf("%d\n" ,ans);
}return 0;
}
其實這個題目是個不錯的貪心題,這個題目我們一定要注意,大硬幣一定是小硬幣的倍數,這個是關鍵,首先我們把所有硬幣按照面值從大到小排序,比c還大的面值想都不用想,直接就加上硬幣個數,然後處理其他的,我們先從大的取,能取多少取多少,就是比如你要取50塊錢,然後現在有
面值 30 15 1
個數 2 5 4
這樣先取的個數是 1 1 4 一共是 30*1+15*1+1*4=49
剩餘個數 1 4 0 距離目標還差1塊錢,然後我們在倒著取
1 15 30
0 4 1
在15的地方取乙個,然後滿足要求了,就行了,這樣做是為了保證超出c的部分的錢是最少的,正確性的前提是 硬幣之間的倍數關係,還有就是存在優化,就是同樣的一次可以同時開出好幾周的工資,這個在寫的時候自己去想吧,還有這個題目要明確乙個問題,就是硬幣之間沒有什麼關係,就是每個硬幣只要保證盡量浪費的少就行了。
poj3040 貪心好題
題目大意 農場主給乙個小弟發工資,每週至少需要發c元,現在fj有一堆硬幣,這些硬幣面值的最大公約數相同即它們成倍數關係。問fj最多能給多少個星期的工資?這道題開始兩次都想錯了,後來看了別人的思路,感覺和裝箱問題有點類似。1 先排除掉大於等於c的面值,這些面值可以單獨發乙個星期 2 從剩下的面值中從大...
poj3040 Allowance 題解報告
題目傳送門 題目大意 有 n 種面值的硬幣,第 i 種有 b i 個,大的硬幣是小的硬幣的倍數,給定乙個金額 k 求最多可以組成多少份金額不小於 k 的組合。思路分析 首先去掉能自成一組的硬幣,然後考慮幾種硬幣湊成一組,貪心策略就是優先考慮面值大的,細節見 實現 1 include2 include...
POJ3660 奶牛競賽(閉包)
每日打卡 1 1 補 題目大意 共有n頭奶牛,奶牛兩兩間比賽,問經過m輪比賽後,有多少奶牛可以確定名次。思路 假設乙個奶牛比x頭奶牛厲害,比y頭奶牛弱,那麼如果x y n 1,則能確定它的名次。因此,我們用floyd來傳遞閉包。include include include include incl...