您的位置:首页 > 其它

#440 Div.2 D.Sorting the Coins 硬币排序问题

2017-10-21 15:42 393 查看
原题链接:

sort the coins

大意:

一排硬币排成一排,有两种硬币,把其中一种按照两两交换的规则归到右侧,求需要归并多少次才能把所有这种硬币归到右侧。

分析:

由于硬币是按照时间顺序放的,容易想到第n个答案和n-1个答案必然存在某种关系。

找规律可以发现:

每次放置一个新的点,答案都比前一个多一,当这个点放在末尾时,相当于回退一个。

每次移动后 每个硬币就是在它的下一个非法硬币的前一个位置

算法每运行一次就是一枚非法硬币归位

具体实现:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int,int> pii;
#define mem(s,t) memset(s,t,sizeof(s))
#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
#define pb push_back

//#define LOCAL
const int mod=1e9+7;
const int MAXN =3e5+10;

int vis[MAXN],ret[MAXN];
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int n;
scanf("%d",&n);
mem(vis,0);
mem(ret,0);
int cnt=0,last=n;
ret[0]=1;
for(int i=1;i<=n;i++){
cnt++;
int x;
scanf("%d",&x);
vis[x]++;
if(x==last) while(vis[last]){
cnt--;
last--;
}
ret[i]=cnt+1;
}
for(int i=0;i<=n;i++)
printf("%d%c",ret[i]," \n"[i==n]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息