其他分享
首页 > 其他分享> > pat-1109

pat-1109

作者:互联网

#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

英语

 

问题 无

 

 

标签:node,pat,int,na,height,ans,return,1109
来源: https://blog.csdn.net/m0_45359314/article/details/113687691