最近看了看贪心,今天更新几道贪心的入门题目
洛谷 1223 排队接水
一道入门的贪心题,了解贪心思想。
//按照贪心的思想将用时少的人先排队即可实现整体用时最少。
#include <bits/stdc++.h>
using namespace std;
struct node{double time;int num;}a[1001];
int cmp(const struct node &a,const struct node &b){//结构体排序!
if(a.time!=b.time)return a.time<b.time;
return a.num<b.num;
}
int main()
{ int n;
double sum=0.0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lf",&a[i].time);
a[i].num=i;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
sum+=a[i].time*(n-i);
}
for(int i=1;i<=n;i++)
printf("%d ",a[i].num);
printf("\n%.2f",sum/n);
return 0;
}
再来一道!!
洛谷 3817 小A的糖果
#include <bits/stdc++.h>
//需要注意数据范围,题目给的数据较大,用int会爆!
using namespace std;
long long box[100001];
int main()
{ unsigned long long n,x,sum=0;
scanf("%lld %lld",&n,&x);
for(int i=0;i<n;i++)
scanf("%lld",&box[i]);
for(int i=0;i<n-1;i++)
{
if(box[i]+box[i+1]>x){
int d=box[i+1]+box[i]-x;
if(box[i+1]-d>0)box[i+1]-=d;//贪心思想
else box[i+1]=0;//注意盒子的糖果不能拿空!
sum+=d;}
}
printf("%lld\n",sum);
return 0;
}
洛谷 1478
再来一道水题
#include <bits/stdc++.h>
using namespace std;
struct node{
int m,n;
}a[5005];
int cmp(struct node a,struct node b){//一样的结构体排序。
if(a.n!=b.n)return a.n<b.n;
return a.m<b.m;
}
int main()
{ ios::sync_with_stdio(0);
int x,y,s,k,l;
int sum=0;
cin>>k>>s>>x>>y;
for(int i=0;i<k;i++)
cin>>a[i].m>>a[i].n;
sort(a,a+k,cmp);//贪心
for(int i=0;i<k&&s>0;i++){
if(x+y>=a[i].m&&s>=a[i].n){
s-=a[i].n;
sum++;
}}
cout<<sum;
return 0;
}