PAT 1109.Group Photo

对数组进行排序,然后按行从中间插入,先向左后向右。

最后是因为运算符重载出错了,积累经验了。(ˇˍˇ) 


#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<vector>
#include<list>
#include<algorithm>
using namespace std;
#define MAX 10012
struct node{
  char name[10];
  int h;
  bool operator >(const node& a)const{
    if(h==a.h){
      return strcmp(a.name,name)>0?true:false;	//最后错误点,没有返回bool型 
    }
    return h>a.h;
  }
};
node a[MAX];
int mem[11][MAX];
int main(){
  int N,K;
  scanf("%d%d",&N,&K);
  
  for(int i=0;i<N;i++){
    getchar();
    scanf("%s%d",a[i].name,&a[i].h);
  }
  sort(a,a+N,greater<node>());
  int n,m;
  n = K;//四舍五入  可能会错  
  m = (int)N/K;//最后一行
  int fr = m+N%K;
  
  int time = 0;	//计数 
  for(int i=0;i<n;i++){
    int r;
    int f = 0;
    if(i==0){	//最上面一行单独判断 
      r = fr-1;
    }
    else r = f+m-1;
    int mid = (f + r)/2 + (f+r)%2;
    int d = mid;
    int c = 1;
    for(int j=f;j<=r;j++){  //左右插入 
      mem[i][d] = time++;
      if(d>=mid)  d=mid-c;	//先左后右 
      else{
        d=mid+c;
        c++;
      }
    }
  }
  for(int i=0;i<n;i++){
    if(i==0){
      for(int j=0;j<fr;j++){
        printf("%s",a[mem[i][j]].name);
        if(j!=fr-1)  printf(" ");
        else printf("\n");
      }
    }
    else{
      for(int j=0;j<m;j++){
        printf("%s",a[mem[i][j]].name);
        if(j!=m-1)  printf(" ");
        else printf("\n");
      }
    }
  }
  return 0;
}


后来实在改不出来了,看大神代码,优化过的,当然错误还是没改出来,( ⊙ o ⊙ )


#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<vector>
#include<list>
#include<algorithm>
using namespace std;
#define MAX 20012
struct node{
	char name[11];
	int h;
	bool operator >(const node& t)const{
		if(h==t.h){
			return strcmp(t.name,name)>0?true:false;
		}
		return h>t.h;
	}
};
node a[MAX];
int main(){
	int N,K;
	scanf("%d%d",&N,&K);
	for(int i=0;i<N;i++){
		scanf("%s%d",a[i].name,&a[i].h);
	}
	sort(a,a+N,greater<node>());
	int n,m;
	
	n = K;//四舍五入
	int fr = N/K+N%K;
	
	int time = 0;
	vector<int> v[K];	//直接插入 
	for(int i=0;i<n;i++){
			for(int j=0;j<fr;j++){
				if(j%2){	//为奇数则插入左面 
					v[i].insert(v[i].begin(),time);
				}
				else{	//偶数插最后 
					v[i].push_back(time);
				}
				time++;
			}
		fr = N/K;	//只需要特殊判最上面一行 
	}
	for(int i=0;i<n;i++){	//vector输出,无需判断 
			for(int j=0;j<v[i].size();j++){
				printf("%s",a[v[i][j]].name);
				if(j!=v[i].size()-1)	printf(" ");
				else printf("\n");
			}		
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值