HDU4415 Assassin’s Creed

贪心

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <algorithm>

 4 #include <cstring>

 5 using namespace std;

 6 const int Ni = 100010;

 7 struct node{

 8     int a,b;

 9     bool operator < (const node &aa) const

10     {

11         return a<aa.a;

12     }

13 }arr[Ni];

14 int main()

15 {

16     int i,n,m,t,k,cs=1;

17     scanf("%d",&t);

18     while(t--)

19     {

20         int ansm=0,ansn=0;k=-1;

21         scanf("%d%d",&n,&m);

22         for(i=0;i<n;i++)

23             scanf("%d%d",&arr[i].a,&arr[i].b);

24         sort(arr,arr+n);

25         for(i=0;i<n;i++) if(arr[i].b>=1)

26             break;

27         if(arr[i].a<=m)

28         {

29             ansm+=arr[i].a;k=i;ansn++;

30             for(i=0;i<n;i++)

31                 ansn+=arr[i].b;

32         }

33         if(ansn>=n) {printf("Case %d: %d %d\n",cs++,n,ansm);continue;}

34         for(i=0;i<n&&arr[i].a+ansm<=m&&ansn!=n;i++)

35             if(i!=k) {ansm+=arr[i].a;ansn++;}

36         printf("Case %d: %d %d\n",cs++,ansn,ansm);

37     }

38     return 0;

39 }

 看了评论后完善的代码

1

6 5
1 0
1 0
1 0
1 0
1 0
5 1

ans: 5 5

上面的程序输出是2 5(不过也AC了可能是数据不够强)

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <algorithm>

 4 #include <cstring>

 5 using namespace std;

 6 const int Ni = 100010;

 7 struct node{

 8     int a,b;

 9     bool operator < (const node &aa) const

10     {

11         return a<aa.a;

12     }

13 }arr[Ni];

14 int main()

15 {

16     int i,n,m,t,k,cs=1;

17     scanf("%d",&t);

18     while(t--)

19     {

20         int ansm=0,ansn=0;k=-1;

21         scanf("%d%d",&n,&m);

22         for(i=0;i<n;i++)

23             scanf("%d%d",&arr[i].a,&arr[i].b);

24         sort(arr,arr+n);

25         for(i=0;i<n;i++) if(arr[i].b>=1)

26             break;

27         if(arr[i].a<=m)

28         {

29             ansm+=arr[i].a;k=i;ansn++;

30             for(i=0;i<n;i++)

31                 ansn+=arr[i].b;

32         }

33         if(ansn>=n) {printf("Case %d: %d %d\n",cs++,n,ansm);continue;}

34         for(i=0;i<n&&arr[i].a+ansm<=m&&ansn!=n;i++)

35             if(i!=k) {ansm+=arr[i].a;ansn++;}

36         int ans_n=ansn,ans_m=ansm;

37         //考虑不杀有刀的人

38         ansn=0;ansm=0;

39         for(i=0;i<n&&arr[i].a+ansm<=m&&ansn!=n;i++)

40             {ansm+=arr[i].a;ansn++;}

41         if(ans_n>ansn||(ans_n==ansn&&ans_m<ansm))

42             printf("Case %d: %d %d\n",cs++,ans_n,ans_m);

43         else

44             printf("Case %d: %d %d\n",cs++,ansn,ansm);

45     }

46     return 0;

47 }

 

你可能感兴趣的:(sass)