2017.8.2

来源:互联网 发布:cloudzoom.js 编辑:程序博客网 时间:2024/05/29 16:39

今天心血来潮 想做几道贪心

(1)luogu1208

USACO1.3]混合牛奶 Mixing Milk

题目描述

由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助Marry乳业找到最优的牛奶采购方案。

Marry乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的。此外,就像每头奶牛每天只能挤出固定数量的奶,每位奶农每天能提供的牛奶数量是一定的。每天Marry乳业可以从奶农手中采购到小于或者等于奶农最大产量的整数数量的牛奶。

给出Marry乳业每天对牛奶的需求量,还有每位奶农提供的牛奶单价和产量。计算采购足够数量的牛奶所需的最小花费。

注:每天所有奶农的总产量大于Marry乳业的需求量。

输入输出格式

输入格式:

第 1 行共二个数值:N,(0<=N<=2,000,000)是需要牛奶的总数;M,(0<= M<=5,000)是提供牛奶的农民个数。

第 2 到 M+1 行:每行二个整数:Pi 和 Ai。

Pi(0<= Pi<=1,000) 是农民 i 的牛奶的单价。

Ai(0 <= Ai <= 2,000,000)是农民 i 一天能卖给Marry的牛奶制造公司的牛奶数量。

输出格式:

单独的一行包含单独的一个整数,表示Marry的牛奶制造公司拿到所需的牛奶所要的最小费用。


解题思想:这算是一道比较水的贪心题了     首先你需要用结构体存贮单价和数量    然后根据单价从小到大排序  然后取n个

代码附下:

#include<bits/stdc++.h>
using namespace std;
struct milk
{
int dd,ss;


}mm[5010];
bool bb(milk a,milk b)
{


return(a.dd<b.dd);


}


int main()
{
int n,m;
cin>>n>>m;
for (int i=1;i<=m;i++) cin>>mm[i].dd>>mm[i].ss;
sort(mm+1,mm+m+1,bb);
int s=0;
int i=0;
while (s<n) 
{
s+=mm[++i].ss;
}
if (s>n)  mm[i].ss=mm[i].ss-(s-n);
int sss=0;
for (int j=1;j<=i;j++) sss+=mm[j].ss*mm[j].dd;
cout<<sss;
  return 0;




(2)luogu1223  排队接水

题目描述

有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。

输入输出格式

输入格式:

输入文件共两行,第一行为n;第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。

输出格式:

输出文件有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。



解题思路:这也是一道水水的贪心题     先用结构体记录时间和序号  然后用时间从小到大排序 保证后面等的时间最小    
                  在算平均时间的时候  我卡了一会会  要时间*后面等的人数   


代码附下:
#include<bits/stdc++.h>
using namespace std;
struct people
{
int time,id;


}pp[1010];
bool mmp(people a,people b)
{
return(a.time<b.time);




}
int main()
{
int n;
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>pp[i].time; pp[i].id=i;
}


sort(pp+1,pp+n+1,mmp);
cout<<pp[1].id;
for (int i=2;i<=n;i++) cout<<" "<<pp[i].id;
cout<<endl;
double s=0;
int j=n-1;
for (int i=1;i<=n-1;i++)
{
s+=pp[i].time*j;
j--;
}
s=s/n;
printf("%.2f",s);
  return 0;
}