题意:
中文题啊
思路:
暴力
反思:
比赛的时候没A出来,一开始是以为是背包,后来一看数据20亿,觉得肯定不是,另外有个不懂背包的同学A了,更加证明不是背包,应该是贪心,这道题和5.12.地震买米相同,我也是这样做的,但是有个地方写错了,应该是按照价格/质量排序,当时是按照价格排序,真是醉了,还有人用3重for写的
CODE1
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
struct node
{
int si;
long long p;
long long m;
double j;
}ls[500];
bool cmp(node a,node b)
{
return a.j < b.j;
}
int main()
{
int n;
long long V;
while(~scanf("%d%lld",&n,&V))
{
int i;
for(i = 0; i < n; i++)
{
scanf("%d%lld%lld",&ls[i].si,&ls[i].p,&ls[i].m);
ls[i].j = (ls[i].p*1.0)/ls[i].m;
}
sort(ls,ls+n,cmp);
long long sum = 0;
for(i = 0; i < n; i++)
{
if(V >= ls[i].si*ls[i].p)
{
sum += ls[i].si*ls[i].m;
V-=ls[i].si*ls[i].p;
}
else
{
sum+=(V/ls[i].p)*ls[i].m;
V = 0;
}
if(V==0)
break;
}
printf("%lld\n",sum);
}
return 0;
}
CODE2
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
using namespace std;
struct node
{
int si;
long long p;
long long m;
}ls[5];
int main()
{
int n;
long long V;
while(~scanf("%d%lld",&n,&V))
{
memset(ls,0,sizeof(ls));
int i, j, k;
for(i = 1; i <= n; i++)
{
scanf("%d%lld%lld",&ls[i].si,&ls[i].p,&ls[i].m);
}
long long int ans = 0;
for(i = 0; i <= ls[1].si; i++)
for(j = 0; j <= ls[2].si; j++)
for(k = 0; k <= ls[3].si; k++)
{
long long mn;
mn = i*ls[1].p+j*ls[2].p+k*ls[3].p;
if(mn <= V)
{
mn = i*ls[1].m+j*ls[2].m+k*ls[3].m;
ans = max(mn,ans);
}
}
printf("%lld\n",ans);
}
return 0;
}