嵊州D4T2 硬币
【问题描述】
卡拉赞的展览馆被入侵了。 展览馆是一条长长的通道,依次摆放着 n 个展柜(从西到东编号依次 为 1—n)。
入侵者玛克扎尔在第 n 个展柜东边召唤了一个传送门,一共施放了 n 次法术,每一次会选取一个展柜,并在那个展柜里召唤一只小鬼, 小鬼被生成前该展柜里的展品会被自动转移(除此以外不能取出展品)。
作为展览馆的守护者,馆长需要选择一个时机进行反击,消灭所有小鬼并摧毁传送门。
展览馆的东端设置了一台巨大的 Morisa 炮,它可以摧毁它正前方一定 范围内的一切(为了安全,开炮时馆长必须在展览馆最西边)。馆长不想误伤展品,所以他需要移动展柜。
馆长可以站在两个展柜中间,交换这两 个展柜。
展览馆被设置了魔法结界,只可以单向通行,所幸在炮台旁有一 个传送门,可以通向展览馆的最西端,但是馆长每次通过传送门都会消耗 一枚麦迪文留下的幸运币,发射魔炮也需要一枚。
现在,馆长想知道他每次召唤后进行反击最少需要多少枚硬币解决危机。
来吧,展览馆只对访客开放。
【输入格式】
第一行一个数n。
第二行n个数,A[i]表示第i次小鬼召唤的位置。
【输出格式】
一行 n+1 个数,B[i]表示第 i 次召唤后反击所需要的最小硬币数(第 一次是传送门的召唤)。
【输入输出样例】
coin.in | coin.out |
3 1 2 3 | 1 2 3 1 |
【样例解释】
【数据说明】
对于40%数据n ≤ 20
对于60%数据n ≤ 100
对于100%数据 1 ≤ n ≤ 300000
有人来教教我吗!
有人来教教我吗!
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 bool g[300001]; 5 int move(int num){ 6 if(n==num) return 1; 7 for(int i=1;i<=num;i++)//假设鬼从左往右生成 8 { 9 g[i]=1; 10 } 11 bool flag1=1,flag2=0; 12 int coin=0; 13 do//传送到左边 14 { 15 for(int i=1;i<=n;i++)//模拟交换,每一组(不是次)只能从右边开始 16 { 17 if(g[i]&&(!g[i+1])&&i!=n) swap(g[i],g[i+1]); 18 if() 19 } 20 21 22 23 for(int i=1;i<=n;i++) 24 { 25 if(g[i]&&(flag2==0)) { 26 flag2==1; 27 if(i+num==n) flag1=0; 28 break; 29 } 30 } 31 32 } 33 while(flag1&&++coin); 34 return coin+2; 35 } 36 37 int main(){ 38 // freopen("coin.in","r",stdin); 39 // freopen("coin.out","w",stdout); 40 cout<<"1"; 41 cin>>n; 42 int a; 43 for(int i=1;i<=n;i++){ 44 cin>>a; 45 cout<<move(a)<<" "; 46 } 47 return 0; 48 } 49 /* 50 发射魔炮需1个coin 51 这与鬼的数量无关 52 53 假设鬼从左往右生成 54 原本馆长在最左边,故至少传送到左边去(为了安全)发射要一枚硬币 55 56 57 58 */