hdu 5203(枚举)
生活随笔
收集整理的這篇文章主要介紹了
hdu 5203(枚举)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:一個長為n的木棍又n個長度為1的小木棍組成,但有一些小木棍是壞的,給出了那些位置上的小木棍是壞的,現在要把長木棍切割成4條,要求其中3條都是不包含壞木棍且長度和最大,而且這3條好木棍可以組成一個三角形,問有多少種切割方式。
解題思路:
首先可以很快的求出最短的壞木棍,接下來就會出現兩種情況,假設砍掉的壞木棍節點分別為L和R;
1、L=1或R=n
這樣剩下的三段是由一整段木棒截來,我們可以枚舉最左邊一段的長度,這樣可以得到一個關于第二段木棍的不等式,稍微討論一下即可。
由組成三角形的條件可知
(x1+n-x1-x2)>x2 得x2<n/2,同樣可得x1<n/2
x1+x2>n-x1-x2 得x2>n/2-x1
即有 n/2-x1<x2<n/2
則符合條件的x2的個數為(n-1)/2-(n/2-x1) //注意這里是小于不是小于等于,所以要多減個1
2、砍掉的壞木棍是中間的一截,這樣的情況就很容易了,枚舉即可。
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> using namespace std;int l,r,x,n,m; int ok(int a,int b,int c) {if(a<b) swap(a,b);if(a<c) swap(a,c);if(b+c>a) return true;else return false; } long long calc2(int x,int y) {long long tot=0;for(int i=1;i<x;i++)if(ok(i,x-i,y)) tot++;for(int i=1;i<y;i++)if(ok(i,y-i,x)) tot++;return tot; } long long calc1(int n) {long long tot=0;for(int i=1;i<=n-2;i++) if(2*i<n) {tot+=(n-1)/2-(n/2-i);}return tot; } int main() {while(scanf("%d%d",&n,&m)!=EOF){l=n,r=1;for(int i=1;i<=m;i++){scanf("%d",&x);l=min(l,x);r=max(r,x);}if(r==n) printf("%lld\n",calc1(l-1));else if(l==1) printf("%lld\n",calc1(n-r));else printf("%lld\n",calc2(l-1,n-r));}return 0; }
總結
以上是生活随笔為你收集整理的hdu 5203(枚举)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JEECG_3.7.2新版本入门讲解—U
- 下一篇: hdu 5230(整数划分,dp)