目录
题目: 拼数
思路:
题目: 合并果子
思路:
题目:凌乱yyy
思路:
题目:拼数
思路:
思路很简单。举个例子:对于a=321,b=32。我们发现a+b=32132,b+a=32321,那么我们当然要后者,所以整个数组都按这个排列即可。
#include <iostream> //拼数P1012
#include <algorithm>
#include <string>
using namespace std;
bool com(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,com);
for(int i=1;i<=n;i++) cout<<s[i];
return 0;
}
题目:合并果子
思路:
贪心(每次都花费最少代价)我们合并后插入排序即可。
也可以直接使用优先级队列priority_queue,之所以priority_queue也可以通过是因为队伍里面本来就是有序的,再插入时排序极快。
#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
思路:
我们只要按照结束时间去即可,然后能赶上这个比赛就参加,不能就不参加。没了
#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;
}