簡單列舉(UVA725、UVA11057、UVA10976)
阿新 • • 發佈:2019-02-17
今天我閒著無聊寫了幾題簡單的列舉,然後發現我對程式設計細節的控制有點差,以後還是要寫寫一些簡單的題目
一、UVA725 Division
題目大意:輸入正整數n,將其表示成abcde/fghij=n的形式,且a~j是數字0~9的一個排列
分析:
首先,列舉0~9是肯定不行的,所以該怎麼暴力列舉呢?
其實,只要列舉fghij就可以通過乘上n得到abcde,然後再判斷是否可行
且當fghij>10^6時就可以跳出枚舉了,
所以,列舉也要動腦子。
注意:1、可以用陣列來標記該數字是否已使用過,但在迴圈結束時要將標記清零。
2、列舉時注意剪枝。
3、輸出“There are no solutions for n."時有一個WA了我2次的句號,雖然我知道各位肯定不會出錯,但我還 是想提醒一下你們。
4、每一組輸出資料之間有空行,但最後一行沒有空行。
下面附上程式碼:
#include<cstdio> #include<cstring> int n,a[10],kase=0; int main() { while(scanf("%d",&n)&&n) { if(kase++)printf("\n"); bool f=true,ok=false; memset(a,1,sizeof(a));//通過 a陣列標記來看數字是否已使用過 for(int i1=0;i1<=99999/n/10000;i1++) { a[i1]=0; for(int i2=0;i2<=9;i2++) if(a[i2]) { a[i2]=0; for(int i3=0;i3<=9;i3++) if(a[i3]) { a[i3]=0; for(int i4=0;i4<=9;i4++) if(a[i4]) { a[i4]=0; for(int i5=0;i5<=9;i5++) if(a[i5]) { a[i5]=0; int x=n*(i1*10000+i2*1000+i3*100+i4*10+i5); if(x>=100000){ok=true;break;}//當abcde和fghij加起來超過10位時可以終止列舉 int b1=x/10000,b2=x/1000%10,b3=x/100%10,b4=x/10%10,b5=x%10; if(a[b1]){ a[b1]=0; if(a[b2]){ a[b2]=0; if(a[b3]){ a[b3]=0; if(a[b4]){ a[b4]=0; if(a[b5]) { printf("%d%d%d%d%d / %d%d%d%d%d = %d\n",b1,b2,b3,b4,b5,i1,i2,i3,i4,i5,n); f=false;//說明n可以分解 } a[b4]=1;//每次別忘了將值變回1 } a[b3]=1; } a[b2]=1; } a[b1]=1; } a[i5]=1; } if(ok)break; a[i4]=1; } if(ok)break; a[i3]=1; } if(ok)break; a[i2]=1; } if(ok)break; a[i1]=1; } if(f)printf("There are no solutions for %d.\n",n);//注意輸出時有一個“.”。 } return 0; }
二、UVA11059 Maximum Product
題目大意:給n個數,找出乘積最大的連續子序列。
分析:
由於資料範圍小到爆了,直接列舉起點和終點。
注意:1、在記錄乘積和答案是,要使用long long。
2、記錄數列的陣列s要開的大一點(你們知道,UVA給的資料範圍向來是不靠譜的,我就因為沒有開大點WA 了3次,不信的話你自己用s[18]來試試)。
3、一定要好好讀題,看看有沒有沒有注意到的細節。
下面是程式碼:
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int n,s[20],kase=0;//一定要將s定義大一點,不然總是WA int main() { while(scanf("%d",&n)!=EOF) { long long ans=0; for(int i=1;i<=n;i++)scanf("%d",&s[i]); for(int i=1;i<=n;i++)//直接列舉序首 { long long x=1; for(int j=i;j<=n;j++) { x*=s[j]; if(x>ans)ans=x; } } printf("Case #%d: The maximum product is %lld.\n\n",++kase,ans); } return 0; }
三、UVA10976 Fractions Again
我太懶了,所以這題你們自己練習吧。
但無論如何,————注意細節