蓝桥杯入门3—贪心算法

(1)排队接水

问题描述

  有N个人排队到M个水龙头去打水,他们装满水桶的时间T1,T2……Tn为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的总时间最少?

输入格式

  第1行:两个整数n和m,n表示人的个数,m表示水龙头的个数;
  第2行,n个数分别表示n个人装水的时间
  数据范围:m<=n/3,n<=1000,t<3000。

输出格式

  一个整数,表示总花费的最少时间。

样例输入

6 2
5 4 6 2 1 7

样例输出

40

提交代码

//#include<iostream>
#include<bits/stdc++.h>
//#include<algorithm>
using namespace std;
int main(){
	int n,m;
	cin>>n>>m;
	int a[10000]={0};
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	//总时间=接水时间+排队时间,对每个人来说自己的接水时间固定
	//所以总时间由中等待时间决定,当接水时间短的在前面时总时间最短
	//因为对于前面接好水的人来说,不用再排队,因此前面接水的人用的时间越短他的等待时间越短
	 sort(a+1,a+n+1); //注是左闭右开:[a+1,a+n+1) 
	int wait[10000]={0};//记录n个人各自的时间 
	int sum=0;
	for(int i=1;i<=m;i++){
		wait[i]=a[i];//前m个用时短的人直接接水,无等待时间 
		sum+=wait[i];
	}
	for(int i=m+1;i<=n;i++){
		wait[i]=a[i]+wait[i-m];
			sum+=wait[i];
	} 
	cout<<sum;
} 

(2)试题 算法训练 礼物

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

  JiaoShou在爱琳大陆的旅行完毕,即将回家,为了纪念这次旅行,他决定带回一些礼物给好朋友。
  在走出了怪物森林以后,JiaoShou看到了排成一排的N个石子。
  这些石子很漂亮,JiaoShou决定以此为礼物。
  但是这N个石子被施加了一种特殊的魔法。
  如果要取走石子,必须按照以下的规则去取。
  每次必须取连续的2*K个石子,并且满足前K个石子的重量和小于等于S,后K个石子的重量和小于等于S。
  由于时间紧迫,Jiaoshou只能取一次。
  现在JiaoShou找到了聪明的你,问他最多可以带走多少个石子。

输入格式

  第一行两个整数N、S。
  第二行N个整数,用空格隔开,表示每个石子的重量。

输出格式

  第一行输出一个数表示JiaoShou最多能取走多少个石子。

样列输入

  8 3
  1 1 1 1 1 1 1 1

样列输出

  6

样列解释

  任意选择连续的6个1即可。

数据规模和约定

  对于20%的数据:N<=1000
  对于70%的数据:N<=100,000
  对于100%的数据:N<=1000,000,S<=10^12,每个石子的重量小于等于10^9,且非负

 

//暴力解导致部分测试点运行超时
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL a[1000]={0};
LL sum(LL start,LL time){
	LL total=0;
	
	for(int i=0;i<time;i++){
		total+=a[start+i];
 
	}
//	cout<<endl;
	return total;
}
int main(){
	 LL n,s;
	 cin>>n>>s;
	LL max=0;
	LL times=0;
	 LL sum_last=0,sum_pre=0;
	 for(LL i=0;i<n;i++){
	 	 cin>>a[i];
	 }
	 for(LL i=0;i<n;i++){
	 	times=0;
	 	for(LL t=1;t<=n/2;t++){
	 		if(i+2*t<=n){
	 				sum_pre=sum(i,t);//输入范围左闭右开 
	 			
	 		sum_last=sum(i+t,t);
	
		//	cout<<sum_pre<<" "<<sum_last<<endl;
	 		if(sum_pre<=s&&sum_last<=s){
			 
	 			 if(t>max)max=t;
			 }
			 }
	 	
	 		
		 }
	 }
	 cout<<max*2<<endl; 
	 return 0;
}

(3)

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

半截詩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值