信息学奥赛一本通 1939:【07NOIP普及组】纪念品分组 | P1094 [NOIP2007 普及组] 纪念品分组
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1939:【07NOIP普及组】纪念品分组 | P1094 [NOIP2007 普及组] 纪念品分组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
ybt 1939:【07NOIP普及組】紀念品分組
洛谷 P1094 [NOIP2007 普及組] 紀念品分組
【題目考點】
1. 貪心
【解題思路】
貪心選擇:選擇價格最小的和最大的紀念品分成一組,若價格最小的和最大的紀念品無法
分成一組,那么價格最大的紀念品單獨一組。
將問題抽象為:有n個數字,要湊成加和小于等于w的組,一組可以有2個數或1個數,最少可以湊多少組。
1. 貪心選擇性質的證明:
貪心選擇:
如果最大值加最小值大于w,那么最大值單獨一組。
如果最大值加最小值小于等于w,最大最小值湊成一組。
如果第一次選擇的組只有最大值,由于最大值無法和其他數字湊成一組,最大值單獨一組是唯一的選擇。
如果第一次的貪心選擇是最大最小值構成的一組。設最大值為lll,最小值為ggg,那么一定有:l+g≤wl+g\le wl+g≤w
假設對于所有最優解,都不包含第一次的貪心選擇,也就是說lll和ggg不會分為一組。
lll可以有以下幾種情況
假設此時ggg單獨一組,那么可以讓ggg與xxx交換,得到lll與ggg一組。
假設此時ggg與另一個數字hhh一組,那么有h+g≤wh+g\le wh+g≤w
由于lll是當時的最大值,那么一定有h≤lh\le lh≤l,所以有h+x≤l+x≤wh+x\le l+x\le wh+x≤l+x≤w,hhh與xxx一組加和并不會超過www。 將ggg與xxx交換,lll與ggg一組,hhh與xxx一組,是可行的。
無論什么情況,都可以通過交換使得lll與ggg一組,這樣做分組數量不會增加,該方案仍然是最優解,最優解中包含了貪心選擇,與假設相悖,原命題得證。
證明方法與證明第1點相似,不再贅述。
2.具體做法:
對所有紀念品按升序排序,設l,r兩個指針指向當前看到的價格最小和最大的紀念品。
- 如果第l和第r個紀念品的價格加和大于w,那么第l紀念品單獨一組,l加1。
- 如果第l和第r個紀念品的價格加和小于等于w,那么第l和第r紀念品分為一組,l和r都加1。
【題解代碼】
解法1:貪心
#include<bits/stdc++.h> using namespace std; #define N 30005 int main() {int p[N], w, n, ct = 0;//ct:組數cin >> w >> n;for(int i = 1; i <= n; ++i)cin >> p[i];sort(p+1, p+1+n);int l = 1, r = n;while(l <= r){if(l != r && p[l] + p[r] <= w){l++;r--;ct++;//l, r湊一組}else{r--;ct++;//r自己湊一組 }}cout << ct;return 0; }總結
以上是生活随笔為你收集整理的信息学奥赛一本通 1939:【07NOIP普及组】纪念品分组 | P1094 [NOIP2007 普及组] 纪念品分组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊天系统服务器端类图怎么画,聊天系统服务
- 下一篇: python怎么学比较有技巧_学pyth