贪心类型题小结

A. 最小硬币问题

#include<iostream>
using namespace std;
const int NUM = 3;
const int Value[NUM] = {1,2,5};
int main(){
	int i,money;
	int ans[NUM] = {0};
	cin>>money;
	for(i = NUM - 1;i >= 0;i--){
		ans[i] = money / Value[i];
		money -= ans[i] * Value[i];
	}
	for(i = NUM - 1;i >= 0;i--)
		cout<<Value[i]<<"元硬币数:"<<ans[i]<<endl;
	return 0; 
}

B. P3817 小A的糖果(模拟)

#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define ms(a,b) memset(a,b,sizeof(a))
#define rush() int T;cin>>T;while(T--)
#define ll long long
//单纯的模拟 我感觉没有贪心思想在里面.... 测试点有2个卡int 
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);

int main(){
	FAST;
	
	ll n,x,arr[N],ans = 0;
	cin>>n>>x;
	
	for(int i = 1;i <= n;i++){
		cin>>arr[i];
		if(arr[i] > x){ 
			ans += arr[i] - x; 
			arr[i] = x;
		}
	}
	
	for(int i = 2;i <= n;i++){
		if(arr[i - 1] + arr[i] > x){
			
			int cur = arr[i - 1] + arr[i] - x;
			ans += cur; 
			if(arr[i] >= cur)arr[i] -= cur;
			else arr[i] = 0;
		}
	}
	
	cout<<ans;
	return 0;
} 

C. HHUOJ1420 看电视

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 105;

struct node{
		int start,end;
	}record[MAXN];
	
bool cmp(const node& a,const node& b){
	return a.end < b.end;
	}
	
int main(){
	int total,fake_number;
	while(cin>>total){
		if(total == 0)break;
		for(int i = 0;i < total;i++)
			cin>>record[i].start>>record[i].end;
	
		sort(record,record + total,cmp);
		int sum = 0;
		int lastend = -1;
		for(int i = 0;i < total;i++){         
			if(record[i].start >= lastend){
				sum++;
				lastend = record[i].end;
			}
		}
		cout<<sum<<endl;
	}
	
	return 0;
}

D. P1223 排队接水

#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define ms(a,b) memset(a,b,sizeof(a))
#define rush() int T;cin>>T;while(T--)
#define ll long long
using namespace std;
const int N = 1e6 + 100;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);

struct node{
	int n;
	int t;
}stu[N];

bool cmp(node a,node b){
	if(a.t < b.t)return 1;
	if(a.t == b.t && a.n < b.n)return 1;
	return 0;
}

ll wait[N];

int main(){
	FAST;
	ll n,ans = 0,cur = 0;
	cin>>n;
	
	for(int i = 1;i <= n;i++){
		stu[i].n = i;
		cin>>stu[i].t;
	}
	
	sort(stu + 1,stu + n + 1,cmp);
	
	for(int i = 1;i < n;i++){
		cur += stu[i].t;
		ans += cur; 
	}
	
	for(int i = 1;i < n;i++)cout<<stu[i].n<<" ";
	cout<<stu[n].n<<endl;
	
	printf("%.2f",ans * 1.0 / n);
	
	return 0;
} 

E. P1803 凌乱的yyy线段覆盖

#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define ms(a,b) memset(a,b,sizeof(a))
#define rush() int T;cin>>T;while(T--)
#define ll long long
//两个测试点恶意爆空间 要开ll 
using namespace std;
const int N = 1e6 + 100;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);

struct node{
	int s;
	int e;
}cot[N];

bool cmp(node a,node b){
	if(a.e < b.e)return 1;
	if(a.e == b.e && a.s < b.s)return 1;
	return 0;
}

int main(){
	FAST;
	ll n,start,end,ans = 1;
	cin>>n;
	
	for(int i = 1;i <= n;i++)cin>>cot[i].s>>cot[i].e;
	
	sort(cot + 1,cot + n + 1,cmp);
	
	start = cot[1].s,end = cot[1].e;
	for(int i = 2;i <= n;i++){
		if(cot[i].s >= end){
			ans++;
			start = cot[i].s;
			end = cot[i].e;
		}
	}
	
	cout<<ans;
	return 0;
} 

F. P1208 [USACO1.3]混合牛奶 Mixing Milk

#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define ms(a,b) memset(a,b,sizeof(a))
#define rush() int T;cin>>T;while(T--)
#define ll long long

using namespace std;
const int N = 5005;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);

struct node{
	int value;
	int amount;
}stu[N];

bool cmp(node a,node b){
	if(a.value < b.value)return 1;
	if(a.value == b.value && a.amount > b.amount)return 1;
	return 0;
}

int main(){
	FAST;
	
	int n,m,cost = 0;
	cin>>n>>m;
	for(int i = 1;i <= m;i++)cin>>stu[i].value>>stu[i].amount;
	
	sort(stu + 1,stu + m + 1,cmp);
	
	for(int i = 1;i <= m;i++){
		if(n >= stu[i].amount){
			n -= stu[i].amount;
			cost += stu[i].value * stu[i].amount;
		}
		else{
			cost += n * stu[i].value;
			break;
		}
	}
	
	cout<<cost;
	return 0;
} 

G. P1094 纪念品分组

#include<iostream>
#include<vector>
#include <cstdio>
#include<algorithm>
#define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);

using namespace std;
const int N = 1e5;

inline int readint()//快读 
{
	int res = 0;
	char c = 0;
	while(!isdigit(c))
		c = getchar();
	while(isdigit(c))
		res = res * 10 + c - '0', c = getchar();
	return res;	
}

int main(){
	FAST;
	int maxn,n,cur,cnt = 0;
	
	
	maxn = readint();
	n = readint();
	
	vector<int>ans;
	
	for(int i = 0;i < n;i++){
		cur = readint();
		ans.push_back(cur);
	}
	
	sort(ans.begin(),ans.end());
	
	while(!ans.empty()){
		int cot = ans[ans.size() - 1];
		
		if(ans.size() == 1){
			cnt++;
			break;
		}
		
		if(cot == maxn){
			ans.pop_back();
			cnt++;
		}
		
		else{
			
			int flag = 0,k;
			
			for(k = ans.size() - 2;k >= 0;k--){
				if(ans[k] + cot <= maxn){
					flag = 1;
					break;
				}
			}
			
			if(flag == 0){
				ans.pop_back();
				cnt++;
			}
			
			else if(flag == 1){
				ans.pop_back();
				ans.erase(ans.begin() + k);
				cnt++;
			}
		}
	}
	
	cout<<cnt;
	return 0;
} 

H. P5019 铺设道路(非本人代码)

#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define ms(a,b) memset(a,b,sizeof(a))
#define rush() int T;cin>>T;while(T--)
#define ll long long
//这个是神仙代码........ 
using namespace std;
const int N = 1e5 + 100;
const int INF = 0x3f3f3f3f;

int main(){
	int n,arr[N],ans = 0;
	cin>>n;
	for(int i = 1;i <= n;i++)cin>>arr[i];
	
	for(int i = 2;i <= n;i++)if(arr[i] > arr[i - 1])ans += arr[i] - arr[i - 1];
	
	cout<<ans + arr[1]; 
} 
贪心问题浅尝辄止,暂时告一段落.日后再战!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值