zoukankan      html  css  js  c++  java
  • AT2369 Ants on a Circle (思路)

    考虑到蚂蚁们的相对位置不会变化,而且,如果把“相遇后掉头”看作是“相遇后交换编号”的话,也可以得出来最后都有哪些位置有蚂蚁

    然后,只要确定哪个位置是“1”就可以了

    然后搞一个指针p代表原来第一个位置的蚂蚁现在的位置(相对于0来说的),每当有蚂蚁穿过0位置,p就根据穿过的方向加加减减就可以了

     1 #include<bits/stdc++.h>
     2 #include<tr1/unordered_map>
     3 #define CLR(a,x) memset(a,x,sizeof(a))
     4 #define MP make_pair
     5 #define fi first
     6 #define se second
     7 using namespace std;
     8 typedef long long ll;
     9 typedef unsigned long long ull;
    10 typedef long double ld;
    11 typedef pair<int,int> pa;
    12 const int maxn=1e5+10;
    13 
    14 inline ll rd(){
    15     ll x=0;char c=getchar();int neg=1;
    16     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
    17     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    18     return x*neg;
    19 }
    20 
    21 int L,N,x[maxn],dir[maxn],y[maxn],rnk[maxn],T,ans[maxn];
    22 
    23 inline bool cmp(int a,int b){return x[a]<x[b];}
    24 
    25 int main(){
    26     //freopen("","r",stdin);
    27     N=rd(),L=rd(),T=rd();
    28     for(int i=1;i<=N;i++) x[i]=rd(),dir[i]=(rd()==1?1:-1),rnk[i]=i;
    29     sort(rnk+1,rnk+N+1,cmp);
    30     ll p=0;
    31     for(int i=1;i<=N;i++){
    32         y[i]=((x[i]+T*dir[i])%L+L)%L;
    33         if(dir[i]==1) p+=ceil(1.0*(T-(L-x[i])+1)/L);
    34         else p-=ceil(1.0*(T-x[i])/L);
    35         // printf(":%d
    ",p);
    36     }
    37     p=(p%N+N)%N;
    38     sort(y+1,y+N+1);
    39     for(int i=p+1;i<=N;i++) ans[rnk[i-p]]=y[i];
    40     for(int i=1;i<=p;i++) ans[rnk[N+i-p]]=y[i];
    41     for(int i=1;i<=N;i++) printf("%d
    ",ans[i]);
    42     return 0;
    43 }
  • 相关阅读:
    Linux 系统下10个查看网络与监听的命令
    Linux下用gdb 调试、查看代码堆栈
    GPIO引脚速度的应用匹配
    编写安全的代码——小心有符号数的右移操作
    C语言实现类似C++的容器vector
    求字符串长度之递归与非递归的C语言实现
    字符串拷贝函数递归与非递归的C语言实现
    WriteLogHelper
    JsonHelper
    ConfigHelper
  • 原文地址:https://www.cnblogs.com/Ressed/p/10585277.html
Copyright © 2011-2022 走看看