题意:有n个球,m个篮子, 要把这n个球放进这些篮子,首先放篮子中求最少的篮子,若数量相同再放距离中间篮子最近的,若距离相同放篮子编号小的。
分析:这道题可以用线段树,set,优先队列 都可以搞
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <string.h>
#include <map>
#include <set>
using namespace std;
#define maxn 100005*3
#define inff 1<<30
struct node
{
int val,dis,id;
node(int val,int dis,int id):val(val),dis(dis),id(id){}
friend bool operator <(node x,node y)
{
if(x.val<y.val)return true;
else if(x.val == y.val)
{
if(x.dis<y.dis)return true;
else if(x.dis==y.dis)
{
if(x.id<y.id)return true;
else return false;
}
else return false;
}
else return false;
}
};
int abs(int x)
{
if(x<0)return -x;
else return x;
}
int n,m;
int a[maxn];
int main()
{
set<node>s;
int i;
while(scanf("%d%d",&n,&m)!=EOF)
{
s.clear();
int mid1,mid2;
if(m%2!=0)
{
mid1=mid2=(m+1)/2;
}
else
{
mid1=m/2;
mid2=mid1+1;
}
for(i=1;i<=m;i++)
{
node tx(0,min(abs(mid1-i),abs(mid2-i)),i);
s.insert(tx);
}
for(i=1;i<=n;i++)
{
node tx=*s.begin();
s.erase(s.begin());
a[i]=tx.id;
tx.val++;
s.insert(tx);
}
for(i=1;i<=n;i++)
{
printf("%d\n",a[i]);
}
}
return 0;
}