From:hzwer.com(2014-5-17)
阿新 • • 發佈:2017-08-03
原來 同名 space 希望 efi tin 停止 -1 換行
Problem 1 雙色球(ball.cpp/c/pas)
【題目描述】
機房來了新一屆的學弟學妹,邪惡的chenzeyu97發現一位學弟與他同名,於是他當起了善良的學長233
“來來來,學弟,我考你道水題檢驗一下你的水平……”
一個棧內初始有n個紅色和藍色的小球,請你按照以下規則進行操作
- 只要棧頂的小球是紅色的,將其取出,直到棧頂的球是藍色
- 然後將棧頂的藍球變成紅色
- 最後放入若幹個藍球直到棧中的球數為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)