1. 程式人生 > >From:hzwer.com(2014-5-17)

From:hzwer.com(2014-5-17)

原來 同名 space 希望 efi tin 停止 -1 換行

Problem 1 雙色球(ball.cpp/c/pas)

【題目描述】

機房來了新一屆的學弟學妹,邪惡的chenzeyu97發現一位學弟與他同名,於是他當起了善良的學長233

“來來來,學弟,我考你道水題檢驗一下你的水平……”

一個棧內初始有n個紅色和藍色的小球,請你按照以下規則進行操作

  1. 只要棧頂的小球是紅色的,將其取出,直到棧頂的球是藍色
  2. 然後將棧頂的藍球變成紅色
  3. 最後放入若幹個藍球直到棧中的球數為n

以上3步驟為一次操作

如棧中都是紅色球,則操作停止,請問幾次操作後停止

chenzeyu97出完題發現他自己不能AC所以想請你幫忙

【輸入格式】

第一行為一個整數n,表示棧的容量為n

第二行為一個字符串,第i個字符表示自頂向下的第i個球的顏色,R代表紅色,B代表藍色

【輸出格式】

一個整數表示操作數

【樣例輸入】

樣例1:

3

RBR

樣例2:

4

RBBR

【樣例輸出】

樣例1:2

樣例2:6

【數據範圍】

50%的數據,1<=n<=20

100%的數據,1<=n<=50

偽題解:

利用dp,找規律就可以水過了(博主用cena出錯,就只用了樣例與第十組數據比較,應該沒問題,如果有,希望讀者直接聯系我)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4
#include<cmath> 5 #include<algorithm> 6 using namespace std; 7 long long n,dp[50],sum=0; 8 char a; 9 int main() 10 { 11 dp[0]=1; 12 for(int i=1;i<50;i++) 13 dp[i]=2*dp[i-1]+1; 14 scanf("%lld",&n); 15 cin>>a; 16 if(a==B) 17 sum++; 18 for
(int i=1;i<n;i++) 19 { 20 cin>>a; 21 if(a==B) 22 { 23 sum+=dp[i-1]; 24 sum++; 25 } 26 } 27 cout<<sum; 28 return 0; 29 }

真題解(from:hzwer)

看完就開始打模擬,數據範圍這麽小是吧。。然後果斷T了

原來是找規律啊。。

把第n個藍球變成紅球要2^n次操作。。然後累加起來,開個longlong

模擬

C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define inf 0x7fffffff using namespace std; int n,st[51],top;char a[51]; bool work() { while(st[top]==1&&top>0)top--; if(top==0)return 0; if(st[top]==2)st[top]=1; for(int i=top+1;i<=n;i++)st[i]=2; return 1; } int main() { scanf("%d",&n); scanf("%s",a); for(int i=1;i<=n;i++) if(a[i-1]==‘R‘)st[n-i+1]=1; else st[n-i+1]=2; for(int i=1;;i++) {top=n;if(!work()){printf("%d",i-1);break;}} return 0; }

正解

C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define inf 0x7fffffff using namespace std; int n,st[51];char a[51]; long long ans; long long pow(int x) { long long s=1; for(int i=1;i<x;i++) s*=2; return s; } int main() { scanf("%d",&n); scanf("%s",a); for(int i=1;i<=n;i++) if(a[i-1]==‘R‘)st[i]=1; else st[i]=2; for(int i=1;i<=n;i++)if(st[i]==2)ans+=pow(i); printf("%lld",ans); return 0; }

From:hzwer.com(2014-5-17)