輸入1:
3 5
3 1
4 8
8 3輸入2:
3 7 9269
21366 1233
7178 23155
16679 23729
15062 28427
939 6782
24224 9306
22778 13606
5 22367
17444 5442
16452 30236
14893 24220
31511 13634
4380 29422
7 18700
25935 4589
24962 9571
26897 14982
20822 2380
21103 12648
32006 22912
23367 20674
輸出1:
yes輸出2:
yes
yes
no各種奇奇怪怪的貪心都能拿很高分
首先對於會使揹包變大的直接加入即可
對於剩下的呢?
題解的方法是按照b排序,從小到大加入
就是假設為yes那麼放入等於刪除,然後就-b+a,然後就和第一種情況一樣了,因為第一種情況是-a+b,結果為正數,這個-b+a結果為正數
我的做法不太一樣
大概是:
對於每種物品,它對m的貢獻是-a+b,乙個負數
而最後乙個放入揹包的物品的貢獻是-a
如果m去掉了所有物品的貢獻,仍然大於等於0,說明是yes
那麼最後乙個就一定是b最小的乙個,因為我要使貢獻減小的盡可能少,最後乙個相比其他多減了乙個b,那麼選最小的b,減少的就最小
正確性好像是對的吧
(如果不正確歡迎大神打臉)
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define n 50100
#define ll long long
using
namespace
std;
int n;
struct nodea[n],b[n];
ll m;
bool cnt(node x,node y)
int main()
sort(a+1,a+t1+1,cnt);
bool bz=1;
fo(i,1,t1) if(m>a[i].x) m=m-a[i].x+a[i].y;else bz=0;
if(bz==0)
sort(b+1,b+t2+1,cnt);
ll jy=0;
fo(i,1,t2) jy=jy-b[i].y+b[i].x;
if(m>=jy) printf("yes\n");else
printf("no\n");}}
Noip2017提高組 乳酪
noip 2017 提高組 不怎麼難啦 思路如下 首先先寫乙個函式判斷兩個洞是否相連,即兩洞之間距離是否小於等於球直徑 注意是直徑 struct dong dong p 1001 bool pd dong a,dong b 第二個難點在於如何判斷是否可以穿過乳酪,對此我們可以模擬老鼠鑽洞 run函式...
NOIP2017提高組 列隊
noip2017提高組 day2 t3 sylvia 是乙個熱愛學習的女孩子。前段時間,sylvia 參加了學校的軍訓。眾所周知,軍訓的時候需要站方陣。sylvia 所在的方陣中有 n m 名學生,方陣的行數為 n,列數為 m 為了便於管理,教官在訓練開始時,按照從前到後,從左到右的順序給方陣中的學...
NOIP 2017 提高組 寶藏
傳送門 參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 n nn 個深埋在地下的寶藏屋,也給出了這 n nn 個寶藏屋之間可供開發的 m mm 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發...