【算法每日一练]-贪心 篇1 拼数 ,合并果子 ,凌乱yyy

今天开始讲贪心,因为没啥模板,所以直接在题中感受吧

目录

题目:拼数

思路: 

题目:合并果子

   思路: 

题目:凌乱yyy

 思路: 


          

题目:拼数

    

思路: 

        

 思路很简单。举个例子:对于a=321,b=32。我们发现a+b=32132,b+a=32321,那么我们当然要后者,所以整个数组都按这个排列即可。

    

另外给你个技巧:题上说输入的类型是整型,但是你用什么接收那才是什么类型,直接用字符串接收多方便呀!学会了没

      

#include <iostream>                 //拼数P1012
#include <algorithm>
#include <string>
using namespace std;
bool cmp(string a,string b)
{
	return a+b>b+a;               //对于a=321,b=32,a+b=32132,b+a=32321,
}                            	  

int main()
{
	string s[25];int n;cin>>n;
	for(int i=1;i<=n;i++) cin>>s[i];
	sort(s+1,s+n+1,cmp);
	for(int i=1;i<=n;i++) cout<<s[i];
	return 0;
}

     

      

题目:合并果子

      

     

   思路: 

       

额,刚开始看到这个题,猜你应该想到了一道很类似的题,只不过那道题是固定了只能相邻的合并,我们那个时候就是用到区间dp做的,当然dfs也可以完成这样的事情!好了,扯远了,回到这个题上吧!

      

             

贪心想法,直接先排个序,每次都按照花费最少代价去合并,合并后插入排序到对应位置即可即可。

          

其实直接使用优先级队列priority_queue会更快,它的内部是根堆结构,在插入新元素时排序说log(n)完成的。

     

#include <iostream>                      
#include <algorithm>              
using namespace std;
int main(){
	int n,a[10001],ans=0;
	cin>>n;
	for(int i=0;i<n;i++)cin>>a[i];
	sort(a,a+n);
	for(int i=1;i<n;i++){
		ans+=a[i-1]+a[i];                      
		a[i]=a[i-1]+a[i];                 //把合并后的数放到a[i]
		for(int j=i+1;j<n;j++){
			if(a[j-1]>a[j])swap(a[j-1],a[j]);   //交换排序,覆盖排序都可以(因为都是一趟就行),就是不要快排
			else break;
		}
	}
	cout<<ans;
	return 0;
}

     

    

 题目:凌乱yyy

     

      

思路: 

      

我们只要按照结束时间去排序即可,遍历顺序每个比赛然后根据end时间能赶上这个比赛就参加,不能就不参加。没了!

      

#include <iostream>                         
#include <algorithm>
using namespace std;
struct text{
	int sta;
	int end;
};
bool cmp(text a,text b)                      //当下最优化,谁先结束,就选谁
{
	return a.end<b.end;
}
int main()
{
	int n,ans=1;cin>>n;text line[n];         //共n场考试
	for(int i=0;i<n;i++) scanf("%d %d",&line[i].sta,&line[i].end);
	sort(line,line+n,cmp);                 //将其按结束时间排序
	int tem=line[0].end;
	for(int i=1;i<n;i++)
	if(tem<=line[i].sta){ans++;tem=line[i].end;}
	cout<<ans;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值