sort+结构体

2019-04-26  本文已影响0人  Vincy_ivy

基本

#include<iostream>
#include<algorithm>
using namespace std;
bool complare(int a,int b)
{
     return a>b;
}
int main()
{
     int a[10]={9,6,3,8,5,2,7,4,1,0};
     for(int i=0;i<10;i++)
     cout<<a[i]<<endl;
     sort(a,a+10,complare);//在这里就不需要对complare函数传入参数了,
//这是规则
     for(int i=0;i<10;i++)
        cout<<a[i]<<endl;
     return 0;
}

斯诺登密码

#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
int main()
{
char sz[27][10]={"zero","a","both","another","first","second","third","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty"};
int num[27]={0,1,2,2,1,2,3,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
char str[60];
gets(str);
int len=strlen(str),j=1,l=0,p=0,i,flag[6],number[100];
flag[0]=0;
for(i=0;i<100;i++)number[i]=0;
for(i=0;i<len;i++)if(str[i]==' '){str[i]='\0';flag[j++]=i+1;}//分解字符串,将空格换成'\0',并保存单词位置
for(i=0;i<j;i++)
    for(int k=0;k<27;k++)
        if(strcmp(str+flag[i],sz[k])==0)
            number[(num[k]*num[k])%100]++;//将单词换成对应得值
for(i=1;i<100;i++)
    for(j=0;j<number[i];j++)
        if(number[i]&&!p++)cout<<i;
        else if(number[i]&&i<10)cout<<0<<i;
        else if(number[i])cout<<i;
if(!p)cout<<0;
return 0;
}

例题

设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
bool compare(string a,string b)
{
    return a+b>b+a;
}
int main()
{
    int n,i;
    string a[20];
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    sort(a,a+n,compare);
    for(i=0;i<n;i++)
        cout<<a[i];
    return 0;
}

魔法照片+结构体排序

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

struct person{
    int W;//权值
    int num;//序号
    int post;//编号
}p[20005];
int W_comp(struct person &a,struct person &b)
{
    if(a.W!=b.W)    return a.W>b.W;
    else            return a.post<b.post;
}
int E[11],n,k;

int main()
{
    int i;
    scanf("%d%d",&n,&k);
    for(i=1;i<=10;i++)
        scanf("%d",&E[i]);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&p[i].W);
        p[i].post=i;
    }
    sort(p+1,p+n+1,W_comp);

    for(i=1;i<=n;i++)
        p[i].W+=E[(i-1)%10+1];
    sort(p+1,p+1+n,W_comp);
    for(i=1;i<=k;i++)
        printf("%d ",p[i].post);
    return 0;
}

在可选的工作中,每次都选取结束时间最早的工作

#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100000;
int N,S[MAX_N],T[MAX_N];
pair<int , int >itv[MAX_N];

void solve(){
//对pair进行的是字典序比较
//为了让结束时间早的工作排在前面,把T存入first,把S存入second 
    for(int i=0;i<N;i++){
        itv[i].first=T[i];
        itv[i].second=S[i];
    } 
    sort(itv,itv+N);

//t是最后所选工作的结束时间
    int ans=0,t=0; 
    for(int i=0;i<N;i++){
        if(t<itv[i].second){
            ans++;
            t=itv[i].first;
        }
    }
    cout<<ans;
} 
int main()
{
    freopen("data","r",stdin);
    cin>>N;
    for(int i=0;i<N;i++)
        cin>>S[i];
    for(int i=0;i<N;i++)
        cin>>T[i];
    solve();
    return 0;
 } 
上一篇 下一篇

猜你喜欢

热点阅读