贪心算法练习

A - 部分背包问题

#include<iostream>
#include<algorithm>
using namespace std;
struct dj{
	double a,b,d;
}s[105];
bool cmp(dj x,dj y){
	return x.d>y.d;
}
int main ()
{
	int n,m;
	cin>>n>>m;
	for(int i = 0 ; i<n ; i++){
		cin>>s[i].a>>s[i].b;
		s[i].d=s[i].b/s[i].a;
	}
	sort(s,s+n,cmp);
	double sum=0;
	for(int i = 0 ; i<n ; i++){
		if(s[i].a<m){
			sum+=s[i].d*s[i].a;
			m=m-s[i].a;
		}
		else{
			sum+=s[i].d*m;
			break;
		}
	}
	printf("%.2lf",sum);
}

L - 凌乱的yyy / 线段覆盖

  

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct act{
	int b,e;
}s[N];
bool cmp(act x,act y){
	return x.e<y.e;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n;
	cin>>n;
	for(int i =1 ; i<=n ;i++){
		cin>>s[i].b>>s[i].e;
	}
	sort(s+1,s+n+1,cmp);
	int cnt=1,end=s[1].e;
	for(int i=2 ; i<=n ; i++){
		if(s[i].b>=end){
			cnt++;
			end=s[i].e;
		}
	}
	cout<<cnt;
	return 0;
 } 

 

M - 删数问题

 

#include<iostream>
#include<string>
using namespace std;
int main()
{	
	string num;
	int n,k,a[255];
	cin>>num>>k;
	n=num.length();
	for(int i=0 ; i<n ; i++){
		a[i]=num[i]-'0';
	}
	for(int l=0 ; l<k ;l++){
		for(int i=0 ;i<n ; i++){
			if(a[i]>a[i+1]){
				for(int j=i ; j<n ;j++){
				a[j]=a[j+1];
				}
				n--;
				break;
			}
		}
	}
	int l=0;
	while(a[l]==0&&l<num.length()-k-1){
		l++;
	}
	for(int i = l ;i<num.length()-k; i++){
		
		cout<<a[i];
	}
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值