A. Subsequence Permutation
题目大意:
给你一个字符串,你可以选择其中k个字符,将这k个字符任意置换,使字典序最小,问最小的k
思路: 将字符排序,如果排序后数组与原数组不同的字符都要选择,使其变换为排序后的数组
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+3;
int a[maxn];
int b[maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d\n",&n);
char now;
for(int i=1;i<=n;++i){
char x;
scanf("%c",&x);
a[i]=x-'a'+1;
b[i]=a[i];
}
sort(b+1,b+n+1);
int sum=0;
for(int i=1;i<=n;++i){
if(a[i]!=b[i])sum++;
}
printf("%d\n",sum);
}
}
B. Running for Gold
题目大意:
有n名运动员参加马拉松比赛,编号从1到n,他们在过去都参加过5次重要的马拉松比赛,
如果运动员x在过去至少3次马拉松比赛中排名优于运动员y,则认为运动员x优于运动员y。
如果一名运动员优于所有其他运动员。
找出任何有可能获得金牌的运动员(即优于所有其他运动员的运动员),或确定没有这样的运动员。
思路:
先通过一轮比较,找出一个暂定的最强者,然后再一轮比较看下有没有比他强的人(判断有没有环)
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+3;
struct a_node{
int x ;
int id;
}a[6][maxn];
bool cmp(a_node a,a_node b){
return a.x<b.x;
}
int s[maxn];
int p[maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i){
for(int j=1;j<=5;++j){
scanf("%d",&a[j][i].x);
a[j][i].id=i;
}
s[i]=0;
}
int now=1;
for(int i=1;i<=n;++i){
int sum=0;
for(int j=1;j<=5;++j)
if(a[j][now].x>a[j][i].x)sum++;
if(sum>=3)now=i;
}
int ans=now;
for(int i=1;i<=n;++i){
int sum=0;
for(int j=1;j<=5;++j)
if(a[j][now].x>a[j][i].x)sum++;
if(sum>=3)ans=-1;
}
printf("%d\n",ans);
}
}