saving hdu
Problem Description 话说上回讲到海东集团面临内外交困,公司的元老也只剩下XHD夫妇二人了。显然,作为多年拼搏的商人,XHD不会坐以待毙的。 |
Input 输入包含多个测试实例,每个实例的第一行是两个整数v和n(v,n<100),分别表示口袋的容量和宝贝的种类,接着的n行每行包含2个整数pi和mi(0<pi,mi<10),分别表示某种宝贝的单价和对应的体积,v为0的时候结束输入。 |
Output 对于每个测试实例,请输出XHD最多能取回多少价值的宝贝,每个实例的输出占一行。 |
Sample Input |
Sample Output |
贪心问题,涉及到结构体排序,sort用法。题目大意,有限容量,让你从一堆宝贝中挑选出价值最大的组合。
思路:首先对结构体按价值从大到小排序,然后贪心法选取。
代码:
#include<algorithm>
#include<cstdio>
#include<iostream>
#define maxn 100
using namespace std;
struct node{
int p;int m;
} s[maxn];
int v;int n;
bool cmp(node s1,node s2)
{
return s1.p>s2.p; //大于号为降序,小于号为升序
}
int main()
{
std::ios::sync_with_stdio(false);cin.tie(0);
while(cin >> v && v!=0)
{
cin >> n;
int ans=0;
for(int i=0; i<n; i++)
cin >> s[i].p >> s[i].m;
sort(s,s+n,cmp);
/*for(int j=0; j<n; j++)
cout << s[j].p << ' ' << s[j].m << endl;*/
for(int j=0; v!=0 && j<n; j++)
{
if(v > s[j].m)
{v-=s[j].m; ans+=s[j].p*s[j].m;}
else if(v <= s[j].m)
{ans+=v*s[j].p; v=0;}
// printf("%d %d %d %d\n",v,n,ans,j);
}
cout << ans << endl;
}
return 0;
}
下一题悼念512是一样的道理,结构体排序然后贪心算法
Input 输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(0<n<=1000,0<m<=1000),分别表示经费的金额和大米的种类,然后是m行数据,每行包含2个整数p和h(1<=p<=25,1<=h<=100),分别表示单价和对应大米的重量。 |
Output 对于每组测试数据,请输出能够购买大米的最多重量(你可以假设经费买不光所有的大米)。 |
Sample Input |
Sample Output |
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define maxn 1000 + 5
using namespace std;
double t,n;int m;
struct node{
double p;double h;
} s[maxn];
bool cmp(node s1,node s2)
{
return s1.p<s2.p;
}
int main()
{
int i=0;
std::ios::sync_with_stdio(false);cin.tie(0);
cin >> t;
while(t--)
{
cin >> n >> m;
for(i=0; i<m; i++)
cin >> s[i].p >> s[i].h;
double ans=0.0;
sort(s,s+m,cmp);
for(i=0; i<m; i++)
{
double k=s[i].p*s[i].h;
if(n > k)
{n-=k;ans+=s[i].h;}
else if(n <= k)
{ans+=n/s[i].p;n=0;break;}
}
printf("%.2f\n",ans);
}
return 0;
}