嵊州D4T2 硬币 有人来教教我吗!

嵊州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 */
在下小见,请过目~

 

posted @ 2019-07-14 21:02  Vanilla_chan  阅读(272)  评论(0编辑  收藏  举报