1. 程式人生 > >10.6比賽 T1

10.6比賽 T1

out names ace 表示 pan raft 接下來 stream else

手工(handicraft)
【題目描述】
小 D 對於手工有一種獨特的熱情。這一天他得到了一個凸 n 邊
形, 每次他可以沿著 任意一條 直線, 將 一塊多邊形用魚片劈成兩部分。
為了裝飾魚片,他需要得到至少 p 個 m 邊形。但是小 D 又很吝惜自
己的魚片的耐久度,所以他希望用最少的 次數來完成這項工作。
【輸入數據】
輸入第一行一個正整數 T,表示數據組數。
接下來 T 行,每行三個正整數 n,m,p,意義如題幹中所述相同。
【輸出數據】
輸出 T 行,每行一個整數,表示最少需要劈幾次才能完成工作。
【樣例輸入】
1
8 4 3
【樣例輸出】
2
【數據範圍】
對於 10%的數據,p=1;
對於 40%的數據,p<=10;
另外 20%的數據,m=3;
對於 100%的數據,1<=T<=5,3<=n,m<=10^9,1<=p<=10^9。

思路:

易得,切一個n邊形有三種情況。

1:n-m+2,m

2:n-m+3,m

3:n-m+4,m

所以,切p個m要一個pm-4p+4變形切p-1次;

我們可以分類討論

當n<pm-4p+4 可以切三角形,把n加到pm-4p+4.

當pm-4p+4<=n<=pm-2p+2 可以發現,無論多少,都可以切除p個m邊形。

當n>pm-2p+2 最後一刀切出的多邊形的邊數一定大於m,所以一定要再切一刀。

代碼:

技術分享
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4
#include<cmath> 5 using namespace std; 6 int t,n,m,p; 7 long long h,hh,daan; 8 int main() 9 { 10 //freopen("handicraft.in","r",stdin); 11 //freopen("handicraft.out","w",stdout); 12 cin>>t; 13 while(t--) 14 { 15 daan=0; 16 cin>>n>>m>>p;
17 h=1LL*(p-1)*(m-4)+m; 18 hh=1LL*(p-1)*(m-2)+m; 19 if(n<h) 20 { 21 daan=h-n+p-1; 22 } 23 else if(n<=hh) 24 { 25 daan=p-1; 26 } 27 else 28 { 29 daan=p; 30 } 31 cout<<daan<<endl; 32 } 33 return 0; 34 }
View Code

10.6比賽 T1