洛谷【算法1-5】贪心

目录

  • P2240 部分背包问题
  • P1803 区间贪心
  • P1090 合并果子
  • P1106 删数问题

P2240 部分背包问题

#include
using namespace std;
const int maxn = 110; 

struct Co{
	int m;//质量
	int v;//价格
	double price;//单价 
}co[maxn];

bool cmp(Co a , Co b){ 
	return a.price>b.price;
}

int main(){
	int n,t;//t背包承载 
	double ans =0;//总价值 
	scanf("%d %d",&n,&t);
	for(int i=0;i<n;i++){
		scanf("%d %d",&co[i].m,&co[i].v);
		co[i].price = (double)co[i].v/co[i].m;
	}
	sort(co,co+n,cmp);//按单价降序排序 
	for(int i =0;i<n;i++){
		if(co[i].m<t){
			t -= co[i].m;
			ans += co[i].v;
		} else{
			ans +=co[i].price * t;
			break;
		}
	} 
	printf("%.2f",ans);
	return 0;
}

P1803 区间贪心

#include
using namespace std;
const int maxn = 100010; 

struct contest{
	int a,b;//开始结束时间 
}con[maxn];
bool cmp(contest x, contest y){
	if(x.a != y.a) return x.a>y.a;
	else return x.b < y.b;//左端点相同按右端点从小到大排序 
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i =0;i<n;i++){
		scanf("%d %d",&con[i].a,&con[i].b);
	}
	sort(con,con+n,cmp);
	int startX = con[0].a;
	int cnt=1;//最多参加的数目(默认第一个参加)
	for(int i=1;i<n;i++){
		if(con[i].b<=startX){
			cnt++;
			startX = con[i].a;
		}
	} 
	printf("%d\n",cnt);
	return 0;
}

P1090 合并果子

#include
using namespace std;
const int maxn = 10010; 
//设置优先级队列,值越小优先级越高 
priority_queue<int,vector<int>,greater<int> > q;//存放果子 
int main(){
	int n;
	cin>>n;//果子种类数
	int temp;//存储果子数目 
	for(int i =0;i<n;i++){
		scanf("%d",&temp);
		q.push(temp);
	} 
	int ans=0;
	while(q.size()>1){
		int x=q.top();//优先级队列中取队首元素用top(堆 
		q.pop();
		int y =q.top();
		q.pop();
		int nx = x+y;
		ans += nx;
		q.push(nx);
	}
	printf("%d\n",ans);
	return 0;
}

P1106 删数问题

#include
using namespace std;
const int maxn = 255;
string s;
int n,a[251];
int main(){	
	cin>>s;
	scanf("%d",&n);//减少的位数
	int len = s.length();
	for(int i=0;i<len;i++) a[i] = s[i]-'0';//字符串转数字
	for(int i =1;i<=n;i++){//删掉的位数 
		for(int j=0;j<len;j++){//遍历字串 
			if(a[j]>a[j+1]){//找到了高位大于低位的数(逆序) 
				for(int k =j;k<len;k++){
					a[k] = a[k+1];
				}
				len--;
				break;
			}
		}
	}//len此时为剩余减去数字后的长度 
	int start =0;//输出的开头坐标 
	int index =0;
	while(a[index]==0&&len-1>start){//删去前面的零(同时防止出现10,1不输出) 
		start++;
		index++; 
	}
	for(int i=start;i<len;i++){
		printf("%d",a[i]);
	}
	return 0;
} 

你可能感兴趣的:(刷题)