题意:有一个单行走廊,每回合第ai个展柜会冒出来一只鬼,右边尽头有一个人间大炮和向最左传送门(费用均1金币),你需要每回合将所有鬼交换展柜,全部至最右,问若从一到n所有回合结束是需多少金币可射死所有鬼。
思路:花一块可将一只鬼挪至最右,然后使用一个指针储蓄最右有几个鬼,然后相减就可以了。
见代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int n,k,a[300001],b[300001]; bool c[300001]; int main() { freopen("coin.in","r",stdin); freopen("coin.out","w",stdout); cin>>n; k=n; b[0]=1; for(int i=1;i<=n;i++) { cin>>a[i]; c[a[i]]=true; if(a[i]==k) { while(c[k]==true) k--; if(k==n-i) b[i]=1; else b[i]=b[i-1]; } else b[i]=1+b[i-1]; } for(int i=0;i<=n;i++) cout<<b[i]<<" "; return 0; }
又双叒叕炸掉了!
原因是部分在右部分不在右的情况未考虑清。
见代码*2:
#include<iostream> using namespace std; int n,k,a[300001],b[300001]; bool c[300001]; int main() { cin>>n; k=n; b[0]=1; for(int i=1;i<=n;i++) { cin>>a[i]; c[a[i]]=true; b[i]=b[i-1]+1; if(a[i]==k) { while(c[k]==true) { b[i]--; k--; } } } for(int i=0;i<=n;i++) cout<<b[i]<<" "; return 0; }