这道题思路。。。想破脑袋没想起来,开始按A排序,后来按B排序,再后来按A/B排序,然后正序走一遍,逆序走一遍,都不对!最后看的解题报告,崩溃!!!按B-A排序。至于证明,不会!这道题告诉我们,关于贪心问题,只要涉及到排序,+,-,*,/,都试试,没准有一个可以的。。。
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int N = 1007;
struct node
{
int a;
int b;
}num[N];
int cmp(const void * c, const void * d)
{
node * e = (node *)c;
node * f = (node *)d;
int cha1 = e->b - e->a;
int cha2 = f->b - f->a;
if(cha1 == cha2) return e->a - f->a;
else return cha2 - cha1;
}
int main()
{
//freopen("data.in", "r", stdin);
int T, n, v, i;
int flag;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &v, &n); flag = 0;
for(i = 0; i < n; i++)
{
scanf("%d%d", &num[i].a, &num[i].b);
if(num[i].b > v || num[i].a > v)
flag = 1;
}
if(flag) { printf("No\n"); continue; }
qsort(num, n, sizeof(node), cmp);
i = 0;
while(i < n)
{
if(v >= num[i].a && v >= num[i].b)
{ v -= num[i].a; i++;}
else
{flag = 1; break;}
}
if(!flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}