您的位置:首页 > 大数据 > 人工智能

CodeForces 195B After Training(STL)

2015-08-07 15:39 393 查看
题意:有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: