题目链接
题目大意
就是给你cnt种描述相同特征的形容词,每一种形容词有num[i]个,然后要你用字典序排列,再去除一些,求第k大的
题目思路
显然是模拟题,但是也太难模拟了,其实求第k大的很简单。先标记要去除的牛的大小号 ,然后排序,如果相等于k,k就++就行了。
注意这里要求进制,还有一堆东西都要注意,看代码把。
代码
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=1e2+5;
int n,k,num[maxn],cnt,pos[maxn],add[maxn];
string str[maxn][maxn],adj[maxn][maxn];
int cmp(string a, string b) {
return a<b;
}
int findd(int x,string s){
for(int i=1;i<=num[x];i++){
if(adj[x][i]==s){
return i;
}
}
return 0;
}
int getpos(int x){
int ans=0;
for(int i=1;i<=cnt;i++){
ans+=add[i]*(findd(i,str[x][i])-1);//-1是因为这里的进制中1相当于0
}
return ans+1;//+1的原因是因为这里的1相当于0
}
int main(){
scanf("%d %d",&n,&k);
string s;
for(int i=1;i<=n;i++){
cin>>s;//上面必须还要有一个,因为如果没有一次循环后就一直s==”no“
while(s!="no"){
cin>>s;
}
for(int j=1;;j++){//开始输入
cin>>str[i][j];
if(str[i][j]=="cow."){//注意有个点
break;
}
if(findd(j,str[i][j])==0){//还没存
adj[j][++num[j]]=str[i][j];
}
cnt=j;//cnt表示有多少个adj
}
}
for(int i=1;i<=cnt;i++){
sort(adj[i]+1,adj[i]+1+num[i],cmp);
}
add[cnt+1]=1,num[cnt+1]=1;//计算进制
for(int i=cnt;i>=1;i--){
add[i]=add[i+1]*num[i+1];
}
for(int i=1;i<=n;i++){//获得位置
pos[i]=getpos(i);
}
sort(pos+1,pos+1+n);//注意要先排序
for(int i=1;i<=n;i++){
if(pos[i]<=k){
k++;
}else{
break;
}
}
k--;//注意k要--
for(int i=1;i<=cnt;i++){
cout<<adj[i][(k)/add[i]+1]<<' ';
k=k%add[i];
}
return 0;
}