贪心刷题(5日计划)第二天

- P3817 小A的糖果

在这里插入图片描述

思路

很容易理解占有两个组的盒子,减去糖果数可以使吃掉的糖果数最少。
但第一个盒子可能大于x,则刚开始的时候就需要减去。

源码

#include<bits/stdc++.h>

using namespace std;

int  n,x;
int a[1000005];
long long sum;

int main(){
	cin>>n>>x;
	cin>>a[1];
	if(a[1]>x){
		sum+=a[1]-x;
		a[1]=x;
	}
	for(int i=2;i<=n;i++){
		cin>>a[i];
		if(a[i]+a[i-1]>x){
			sum+=a[i]+a[i-1]-x;
			a[i]=x-a[i-1];
		}
	}
	cout<<sum<<endl;
	return 0; 
}

- P3650 [USACO1.3]滑雪课程设计Ski Course Design

在这里插入图片描述

思路

看到这个题目,可以想到肯定第一反应是要比较最高和最低的差。
然后可以进行排序。然后分别将最低峰和最高峰这个区间内的高度a作为最低的高度,其他的高度在a+17内

源码

#include<bits/stdc++.h>

using namespace std;


int n,a[1005];
int main(){
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>a[i];
	sort(a,a+n);
	int sum=0,s=1e9;

	for(int j=a[0];j<=a[n-1];j++){
		sum=0;
		for(int t=0;t<n;t++){
			if(a[t]-j>17) sum+=(a[t]-j-17)*(a[t]-j-17);
			if(a[t]<j)    sum+=(a[t]-j)*(a[t]-j); 
			
		}
		s=min(sum,s);
	}
	cout<<s<<endl;
}

- P1803 凌乱的yyy / 线段覆盖

在这里插入图片描述

思路

把时间按结束时间排序,然后在进行计较。
计较的关键点:下一个点的开始时间大于上一个结束的时间。

源码

 #include<bits/stdc++.h>//(万能库)
struct px{//(定义一个结构体数组,分别储存开始时间和结束时间)
    int a;//(开始时间)
    int b;//(结束时间)
}x[2000000];
bool cmp(px x,px y){//(不管开始时间,直接按照结束时间排序)
    return x.b<y.b;
    }
using namespace std;
int main(){
    int n,sum=1,mi;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    cin>>x[i].a>>x[i].b;//(读入数据)
    sort(x+1,x+n+1,cmp);//(排序)
    mi=x[1].b;//(无脑记录第一个值)
    int j=1;
    while(j<=n)//(未优化的超长循环)
    {
        j++;
        if(x[j].a>=mi) {//(找到符合要求的比赛,记录,参加)
        sum++;//(计数)
        mi=x[j].b;}
    }
    cout<<sum;//(输出)
    return 0;//(功德圆满)
    }

##- P1610 鸿山洞的灯
在这里插入图片描述

思路

排序+比较
可以这样判断p[i+1]-p[i-1]<=dist 满足的话,则熄灭中间的p[i]。然后就可以把p[i-1]往前移,即p[i]=p[i-1]。
然后又继续判断三盏灯。

源码

#include<bits/stdc++.h>

using namespace std;

int main(){
	int n,dist;
	int p[1000005];
	cin>>n>>dist;
	int sum=0;	
	for(int i=0;i<n;i++)
		cin>>p[i];
		sort(p,p+n);
	for(int i=1;i<n-1;i++){
		if((p[i+1]-p[i-1])<=dist){
			p[i]=p[i-1];    //进入下一次循环,就相当于p[i-1] 
			//优化的核心部分。我们使用递推优化。
			//其本质是关灯时把前一盏灯移到当前这一盏灯的位置上,
			//防止下次计算时寻找前一盏灯。有类似链表删除的作用。
			sum++;
		}
	}
	cout<<sum<<endl;	
}

- P2095 营养膳食

在这里插入图片描述

思路

可以按脂肪排序,然后用一个数组来标记每个种类用掉的份数。

源码

#include<bits/stdc++.h>

using namespace std;

struct per{
	int weigh;
	int id;
	
}p[10005];

int cmp(per a,per b){  //按脂肪从大到小排序 
	return a.weigh>b.weigh;
}
int main(){
	int n,m,k;
	cin>>n>>m>>k;
	int b[10005];//每类需要的类数;
	for(int i=1;i<=k;i++)
		cin>>b[i];
	for(int i=1;i<=n;i++)
		cin>>p[i].weigh>>p[i].id;
	sort(p+1,p+1+n,cmp);
	int ans=0;
	
	for(int i=1;i<=n;i++){
		if(b[p[i].id]>0&&m>0){  //判断哪个种类是否还需要和是否还需要吃食品 
			b[p[i].id]--;
			m--;
			ans+=p[i].weigh;
		}
	}
	cout<<ans<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღ江晚吟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值