贪心(我觉得最简单的了

P2240
这根本不是背包,就设计一个结构体,然后排序,然后就比较一下减过之后的体积,然后按照不够的话,就单价乘以数量的思想

#include<iostream>
#include<algorithm>
using namespace std;
struct TR
{
	double w,v;
}tr[105];
bool cmp(struct TR x,struct TR y)
{
	return x.v /x.w >y.v /y.w ;
}
int a[105];
int main()
{
	int N,T;
	double ans=0,weight=0,mp=0;
	cin>>N>>T;
	for(int i=1;i<=N;i++)
	{
		cin>>tr[i].w >>tr[i].v ;
	}
	sort(tr+1,tr+N+1,cmp);
	for(int i=1;i<=N;i++)
	{
		
		if(tr[i].w <=T)
		{
			T-=tr[i].w ;
			ans+=tr[i].v ;
		}
	
		else
		{
			ans+=T*(tr[i].v /tr[i].w );
			break;
		}
		
	 } 
	 printf("%.2f",ans);
	 return 0;
	
	
	
}

P1803
按照比赛结束时间排序
结束时间结束时间!!!!因为其实开始时间没有什么重要的,就是用来比较

#include<iostream>
#include<algorithm>
using namespace std;
struct Node
{
	int st;
	int end; 
}a[100007];
bool cmp(struct Node x,struct Node y)
{
	return x.end<y.end ;
}
int main()
{
	int m,cur,cont=1;
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>a[i].st >>a[i].end ;
	}
	sort(a+1,a+m+1,cmp);
	cur=a[1].end ;
	for(int i=1;i<=m;i++)
	{
		
		if(a[i+1].st >=cur )
		{
			cont++;
			cur=a[i+1].end;
		}
	}
	cout<<cont;
	return 0;
	
}
P1090
夸夸优先队列,是以堆为内层结构的,greater<int>是从小到大,所以每一次取出来top,然后pop,这样子两次过后,就是最小的两个,相加再插进去,然后这个优先队列就会自动排序,循环m-1就好了	
#include<iostream>
#include<queue>
using namespace std;
int a[10086]; 
priority_queue<int ,vector<int>,greater<int> >qu;
int main()
{
	int m,x,y,ans=0;
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>a[i];
		qu.push(a[i]);
	}
	for(int i=1;i<=m-1;i++)
	{
		x=qu.top();
		qu.pop();
		x+=qu.top(); 
		ans+=x;
		qu.pop();
		qu.push(x);
		
	}
	
	cout<<ans;
}

P1208
就当成一个模板,存在这里吧

#include<iostream>break!!!!
#include<algorithm>
using namespace std;
struct Niu
{
	int dan;
	int nai;
}a[1000089];
bool cmp(struct Niu x,struct Niu y)
{
   return x.dan <y.dan ;
}
int main()
{
	int xu,ti,ans=0;
	cin>>xu>>ti;
	for(int i=1;i<=ti;i++)
	{
		cin>>a[i].dan >>a[i].nai ;
	}
	sort(a+1,a+ti+1,cmp);
	for(int i=1;i<=ti;i++)
	{
		if(xu>=a[i].nai )
		{
			xu-=a[i].nai;
			ans+=a[i].dan *a[i].nai ;
		}
		else
		{
			ans+=a[i].dan*xu;
			break;
		}
	}
	cout<<ans;
	return 0; 
 } 

P1094
这个还是要想一想的,需要两个指针,一头一尾,看他们相加是否满足

#include<iostream>
#include<algorithm> 
using namespace std;
int a[100000];
int main()
{
	int mon,ge;
	cin>>mon>>ge;
	int end=ge,st=1,cont=0;
	for(int i=1;i<=ge;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+ge+1);
	while(st<=end)
	{
	
		if(a[end]+a[st]<=mon)
		{
			cont++;
			end--;
			st++;
		}
		else
		{
			cont++;
			end--;
		}
	}
cout<<cont;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值