您的位置:首页 > 其它

Codeforces Round #441 D. Sorting the Coins(模拟)

2017-10-16 22:37 316 查看
http://codeforces.com/contest/876/problem/D

题意:
题意真是难懂,就是给一串序列,第i次操作会在p[x](1<=x<=i)这些位置放上硬币,然后从左到右观察,如果第i个位置有硬币但第i+1个位置没有硬币,那么互换,然后继续从第i+1个硬币开始看。直到不需要交换,需要计算出到终极状态需要多少步。

思路:

模拟。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn = 300000+5;

int n;
int p[maxn];
int a[maxn];
vector<int> ans;

int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n))
{
ans.clear();
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++) scanf("%d",&p[i]);
int max_right=n;
int cnt=0;
for(int i=1;i<=n;i++)
{
a[p[i]]=1;
if(p[i]==max_right)
{
for(int j=max_right-1;j>=1;j--)
{
if(!a[j])  {max_right=j;break;}
else cnt--;
}
}
else
{
cnt++;
}
ans.push_back(cnt+1);
}
printf("1");
for(int i=0;i<ans.size();i++)
printf(" %d",ans[i]);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: