1. 程式人生 > >【貪心】10.24assassin

【貪心】10.24assassin

har ima dig == getc end 分析 style -s

技術分享圖片


題目分析

沒有題目分析……

寄存一下神奇反悔貪心

 1 #include<bits/stdc++.h>
 2 const int maxn = 100035;
 3 
 4 struct node
 5 {
 6     int a,b;
 7     node(int x=0, int y=0):a(x),b(y) {}
 8     bool operator < (node x) const
 9     {
10         return a < x.a;
11     }
12 }a[maxn],b[maxn];
13 int T,n,m,mn,tot; 14 int mx,ans,cnt1,cnt2; 15 16 int read() 17 { 18 char ch = getchar(); 19 int num = 0; 20 bool fl = 0; 21 for (; !isdigit(ch); ch=getchar()) 22 if (ch==-) fl = 1; 23 for (; isdigit(ch); ch=getchar()) 24 num = (num<<1)+(num<<3
)+ch-48; 25 if (fl) num = -num; 26 return num; 27 } 28 int main() 29 { 30 freopen("assassin.in","r",stdin); 31 freopen("assassin.out","w",stdout); 32 T = read(); 33 while (T--) 34 { 35 n = read(), m = read(); 36 cnt1 = cnt2 = mx = ans = tot = 0, mn = m+1
; 37 for (int i=1; i<=n; i++) 38 { 39 int x = read(), y = read(); 40 if (y) a[++cnt1] = node(x, y), mn = std::min(mn, x), tot += y; 41 else b[++cnt2] = node(x, y); 42 } 43 std::sort(a+1, a+cnt1+1); 44 std::sort(b+1, b+cnt2+1); 45 if (m >= mn){ 46 mx = tot+1, ans = mn; 47 if (mx >= n){ 48 printf("%d %d\n",n,mn); 49 continue; 50 } 51 cnt2 -= mx-cnt1; 52 for (int i=2; i<=cnt1; i++) b[++cnt2] = a[i]; 53 std::sort(b+1, b+cnt2+1); 54 for (int i=1; i<=cnt2&&mx<n; i++) 55 if (ans+b[i].a <= m) mx++, ans += b[i].a; 56 else break; 57 printf("%d %d\n",mx,ans); 58 }else{ 59 mx = 0; 60 for (int i=1; i<=cnt2; i++) 61 if (b[i].a <= m) m -= b[i].a, mx++, ans += b[i].a; 62 printf("%d %d\n",mx,ans); 63 } 64 } 65 return 0; 66 }

END

【貪心】10.24assassin