山魔

有n 座山,每座山有南北两面。
每一天,一些山的某一面(不一定相同) 会受到山魔的袭击。
但是山魔一天最多只会袭击k 座山。
当每座山的每一面都被袭击过后,山魔就会离开。
那么至少要经过多少天,山魔会消失?
Input
一行两个正整数n, k。
Output
一个整数,表示答案。
Examples
devil.in devil.out
3 2 3
Notes
对于所有数据,满足1 ≤ n, k ≤ 10。
Task1[10%]
k = 1

Task2[50%]
k ≤ 4
Task3[100%]
无特殊限制

思路:

这个问题其实就相当于我们小学学的“锅煎蛋”问题,给你蛋的数量n和锅的数量k,一个锅煎一面蛋要1分钟,求要几分钟可把每个蛋的两面煎完。

此题目很简单,代码如下。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,k;
int main()
{
    freopen("devil.in","r",stdin);
    freopen("devil.out","w",stdout);
    cin>>n>>k;
    if(k>=n) cout<<2<<endl;//若锅比蛋多,则可以花1min去煎每个蛋的一面,所以要用2min。 
    else cout<<ceil(n*2/k*1.0)<<endl;
    return 0;
}

证明:

若n为k的倍数,则毋庸置疑,ans=n*2/k;

若n>2*k,则可以把n减去s倍的k,使n<2*k(n=2*k时就变成上面的式子了)然后ans+=s*2;

这时候我们定义x=n-s*k。

再花1min煎x个蛋,花1min煎后x个蛋的另一面,ans+=2,所以剩下(n-x)*2个面。

又因为n<2*k,所以剩下的面<2k,ans+=2

所以ans=(s+2)*2,正好满足。证毕。

猜你喜欢

转载自www.cnblogs.com/xinxiyuan/p/11182361.html