HDU ACM-Step 1.3.4-1.3.5 saving HDU && 悼念512

saving hdu 

Problem Description

话说上回讲到海东集团面临内外交困,公司的元老也只剩下XHD夫妇二人了。显然,作为多年拼搏的商人,XHD不会坐以待毙的。
  一天,当他正在苦思冥想解困良策的时候,突然想到了自己的传家宝,那是公司成立的时候,父亲作为贺礼送来的一个锦囊,徐父当时交代,不到万不得已的时候,不要打开它。“现在不正是最需要的时候吗?”,一边想,XHD一边找到了这个精心保管的锦囊,打开一看,里面只有一句话“杭城北麓千人洞有宝”。
  二话不说,XHD拿起一个大口袋就出发了,这个千人洞他是知道的,小的时候,爸爸曾经带他来过这个隐蔽的路口,并告诉他,这是千人洞。他现在才明白爸爸当初这句话的含义。
  尽管有点印象,XHD还是花了很大的精力才找到这个异常隐蔽的洞口,走进一看,几乎惊呆了,真的是眼花缭乱!不过尽管宝贝的种类不少,但是每种宝贝的量并不多,当然,每种宝贝单位体积的价格也不一样,为了挽救HDU,现在请你帮忙尽快计算出来XHD最多能带回多少价值的宝贝?(假设宝贝可以分割,分割后的价值和对应的体积成正比)

Input

输入包含多个测试实例,每个实例的第一行是两个整数v和n(v,n<100),分别表示口袋的容量和宝贝的种类,接着的n行每行包含2个整数pi和mi(0<pi,mi<10),分别表示某种宝贝的单价和对应的体积,v为0的时候结束输入。

Output

对于每个测试实例,请输出XHD最多能取回多少价值的宝贝,每个实例的输出占一行。

Sample Input

2 2
3 1
2 3
0

Sample Output

5

贪心问题,涉及到结构体排序,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

对于每组测试数据,请输出能够购买大米的最多重量(你可以假设经费买不光所有的大米)。
每个实例的输出占一行,保留2位小数。

Sample Input

1
7 2
3 3
4 4

Sample Output

2.33

代码:

#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;
}

猜你喜欢

转载自blog.csdn.net/calculus_a/article/details/79270719