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;
}