#include<bits/stdc++.h>
using namespace std;
struct node{
char na[10];
int height;
};
bool cmp(node&a,node&b){
if(a.height!=b.height) return a.height>b.height;
else return strcmp(a.na,b.na)<0;
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
int _1,_2;
_1=n/k;
_2=n-(n/k)*(k-1);
vector<node> v(n+1);
for(int i=1;i<=n;i++){
scanf("%s %d",&v[i].na,&v[i].height);
}
sort(v.begin()+1,v.begin()+n+1,cmp);
map<int,string> is;
for(int i=1;i<=n;i++){
is[i]=v[i].na;
}
int p=1;
for (int i=0;i<k;i++){
vector<int> ans(_2+1);
//int ans[_2+1];
int cen=double(_2*1.0/2+1) ;
ans[cen]=p;int a=1,b=1,flag=1;
for(int i=p+1;i<=_2+p-1;i++){//一段段的判断时要同时改变起点和终点的起始值都加p
if(flag==1){
ans[cen-a]=i;
a++;
flag=0;//交替赋值不能简单奇偶
}
else{
ans[cen+b]=i;
b++;
flag=1;
}
}
/* cout<<is[p];
for(int i=2;i<=_2;i++){
// printf(" %s",is[i].c_str());
cout<<is[i];
} */
printf("%s",is[ans[1]].c_str());
for(int i=2;i<=_2;i++){
printf(" %s",is[ans[i]].c_str());
}
printf("\n");
p+=_2;
_2=_1;
}
return 0;
}
总结
1.当题干很长时,提取了信息以后一定要标个好,这样信息考虑的才全面
2.当一段段判断改变时,起点和终点起始值都要改变+同一个数
3.交替赋值,开关,不是简单奇偶,像踢球一样
4.自增自减标记 给数组赋值时
5.这里取中间位置要加1带入几个数判断即可 取中间位置要根据题意来有时候加0.5有时加1
英语
问题 无