排队

篮球队员身高问题

 

n个篮球队员,平均身高2000mm,身高范围1950~2050mm。求一个列,使得对于任意一个给定的k,任意k个连续队员的身高之和与k*2000之差的绝对值小于100

方法:首先,预处理,所有的减去2000,有负有正,分为两个数组。初始总值为0.如果总值加上一个正值小于50,则加上该正值,否则,加上一个负值。由于条件的限制,每个数值的绝对值一定是小于50的。最终一定能找到这样一个序列,因为所有的队员的平均身高为0(2000)

#include <stdlib.h> #include <stdio.h> #include <iostream> #define MAXN 200 struct person { int index; int height; }; int arrange[MAXN]; person neg[MAXN]; person pos[MAXN]; int negNum; int posNum; int main() { int n;//the num of the sporters. std::cin>>n; int temp; negNum=0,posNum=0; for(int i=0;i<n;i++) { std::cin>>temp; temp=temp-2000; if(temp<=0) { neg[negNum].index=i+1; neg[negNum].height=temp; negNum++; } else { pos[posNum].index=i+1; pos[posNum].height=temp; posNum++; } } int total=0; int negIndex=0; int posIndex=0; for(int i=0;i<n;i++) { if((total+pos[posIndex].height<50)&&posIndex<posNum) { total+=pos[posIndex].height; arrange[i]=pos[posIndex].index; posIndex++; } else { total+=neg[negIndex].height; arrange[i]=neg[negIndex].index; negIndex++; } } for(int i=0;i<n;i++) { std::cout<<arrange[i]<<std::endl; } return 0; } 

 

点赞