CodeForces 195B After Training(STL)

来源:互联网 发布:mac系统如何进入终端 编辑:程序博客网 时间:2024/06/05 15:01

题意:有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<<30struct 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;}


0 0
原创粉丝点击