主体思路:制造合理顺序(性价比排序等),一个一个选。
我们就可以多试几种,(性价比,价值等等)。。
然后套进work
结果:采药,过来三个点。
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int ans,f=1;char ch;
while ((ch=getchar())<'0'||ch>'9') if (ch=='-') f=-1;ans=ch-'0';
while ((ch=getchar())>='0'&&ch<='9') ans=ans*10+ch-'0';
return ans*f;
}
int n,m,ans;
struct aa
{
int v,c;
double b;
}a[1005];
void work()
{
int tmp=0,mm=m;
for (int i=1;i<=n;i++)
if (mm>=a[i].v) mm-=a[i].v,tmp+=a[i].c;
ans=max(ans,tmp);
}
bool cmp1(aa a,aa b)
{
return a.b>b.b;
}
void work1()
{
for (int i=1;i<=n;i++) a[i].b=double(a[i].c)/double(a[i].v);
sort(a+1,a+n+1,cmp1);
work();
}
bool cmp2(aa a,aa b)
{
return a.c>b.c;
}
void work2()
{
sort(a+1,a+n+1,cmp2);
work();
}
bool cmp3(aa a,aa b)
{
return a.v<b.v;
}
void work3()
{
sort(a+1,a+n+1,cmp3);
work();
}
void work_rand()
{
for (int i=1;i<=150000;i++)
{
random_shuffle(a+1,a+n+1);
work();
}
for (int i=1;i<=150000;i++)
{
random_shuffle(a+1,a+n+1);
for (int i=1;i<=n/2;i++) swap(a[i],a[n-i+1]);
work();
}
}
bool cmp4(aa a,aa b)
{
return a.c*a.v<b.c*b.v;
}
void work4()
{
sort(a+1,a+n+1,cmp4);
work();
}
int main()
{
m=read();n=read();
for (int i=1;i<=n;i++) a[i].v=read(),a[i].c=read();
work1();
work2();
work3();
work4();
work_rand();
printf("%d",ans);
return 0;
}
总结
1:我们在oi的很多问题当中,有一些是取最优值,想不到dp或别的思路,那么我们可以试着用多种(完全可以尽量多,毕竟是偏分的)
贪心来解,然后取最优值来做。
本题就是一种很好的思路