STL关于sort字符串的排序(string数组,char数组)

Safecracker

字符串中字母降序排序 (STL sort string不太行,应sort char数组)

题意:

给定一个target,和一个字符串

要求在该字符串中找到5个字符,字符在字母表中序号符合:

v - w^2 + x^3 - y^4 + z^5 = target

找到输出这个5个字母,存在多个只输出字典序大的

思路:

STL中sort可以排string数组,也可以排char数组

将该字符串存入ch[]中,sort后枚举ch[]中字母,判断是否符合

Solved

#include <bits/stdc++.h>
using namespace std;
#define int long long 

signed main()
{
	std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int t;
	char s[20];
	while(cin>>t>>s){
		if(t==0 &&strcmp(s,"END")==0){
			break;
		}
		int len=strlen(s);
		sort(s,s+len,greater());
		// cout<<s<<endl;
		int flag=0;
		for(int a=0;a<len;a++){
			for(int b=0;b<len;b++){
				if(b==a) continue;
				for(int c=0;c<len;c++){
					if(c==b||c==a) continue;
					for(int d=0;d<len;d++){
						if(d==c||d==b||d==a) continue;
						for(int e=0;e<len;e++){
							if(e==d||e==c||e==b||e==a) continue;
							int v=s[a]-'A'+1;
							int w=s[b]-'A'+1;
							int x=s[c]-'A'+1;
							int y=s[d]-'A'+1;
							int z=s[e]-'A'+1;
							if(v-w*w+x*x*x-y*y*y*y+z*z*z*z*z==t){
								flag=1;
								cout<<s[a]<<s[b]<<s[c]<<s[d]<<s[e]<<endl;
								break;
							}
						}
						if(flag==1){
							break;
						}
					}
					if(flag==1){
						break;
					}
				}
				if(flag==1){
					break;
				}
			}
			if(flag==1){
				break;
			}
		}
		if(flag==0){
			cout<<"no solution"<<endl;
		}
		memset(s,0,sizeof(s));
	}
	return 0;
}

DNA Sorting

字符串中字母逆序对排序 (STL sort string中逆序对)

题意:

给定m个n长度的dna序列,要求按它们中存在的逆序字母个数排序(个数升序排列)

思路:

结构体存一下的字符串和逆序字母的数量

首先从后往前遍历dp出每个字符串中逆序字母的数量,再按逆序字母数量排序

Solved

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct DNA
{
    string s;
    int t;
}a[110];
int b[4];
int cmp(DNA p,DNA q)
{
    if(p.t<q.t) return 1;
    return 0;
}
int main()
{
    std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,m;cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>a[i].s;
        // cout<<a[i].s<<endl;
        int sum=0;
        memset(b,0,sizeof(b));
        for(int j=n-1;j>=0;j--){//从后往前扫
            if(a[i].s[j]=='A'){//字符串后面A出现的个数
                b[1]++;//C可与之结合
                b[2]++;//G可与之结合
                b[3]++;//T可与之结合
            }
            else if(a[i].s[j]=='C'){//字符串后面C出现的个数
                sum+=b[1];//遇到C则C之前存的A个数加上
                b[2]++;//G可与之结合
                b[3]++;//T可与之结合
            }
            else if(a[i].s[j]=='G'){//字符串后面G出现的个数
                sum+=b[2];//遇到G则G之前存的A,C个数加上
                b[3]++;//T可与之结合
            }
            else if(a[i].s[j]=='T'){
                sum+=b[3];//遇到T则T之前存的A,C,G个数加上
            }
        }
        a[i].t=sum;
    }
    stable_sort(a+1,a+1+m,cmp);
    for(int i=1;i<=m;i++){
        cout<<a[i].s<<endl;
    }

    return 0;
}

AtCoder Janken 2

sort string

题意:

给定n个字符串,字符串序号按字典序排列(0~n),n个数字,这n个数字和对n求余k,输出第k个出现的字符串

思路:

用string数组按顺序(0~n-1)存入字符串,sort排序输出str[k];

Solved

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;

string s[110];
signed main()
{
    std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n;cin>>n;
    int x,sum=0;
    for(int i=0;i<n;i++){
        cin>>s[i]>>x;
        sum+=x;
    }
    sort(s,s+n);
    // for(int i=0;i<n;i++){
    //     cout<<s[i]<<endl;
    // }
    cout<<s[sum%n];
    return 0;
}

Let the Balloon Rise

sort string

题意:

给定n个随机颜色(颜色用字符串表示)的气球,输出出现次数最多的气球

思路:

将气球存入string数组,用STL中sort将气球按字典序排列,这样相同的气球就会在一起

用sum存气球出现的次数,如果s[i]!=s[i-1],此时气球颜色换了,要重置sum,每次更新max

Solved

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int N=1e3+10;
string s[N];

signed main()
{
    std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n;
    while(cin>>n){
        if(n==0) break;
        int mx=1,sum=1;
        int b;
        for(int i=1;i<=n;i++){
            cin>>s[i];
        }
        sort(s+1,s+1+n);
        // for(int i=1;i<=n;i++){
        //     cout<<s[i]<<endl;
        // }
        for(int i=1;i<=n;i++){
            if(s[i]==s[i-1]){
                sum++;
            }else{
                sum=1;
            }
            if(sum>mx){
                mx=sum;
                b=i;
            } 
        }
        if(mx==1){
            cout<<s[1]<<endl;
        }else{
            cout<<s[b]<<endl;
        }
        
    }   
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值