题解 P4956 【[COCI2017-2018#6] Davor】
一道入门题
这道题还是挺简单的,就是两个for循环来找x和k,如果52周刚好攒够就满足条件,因此可知
x+x+k+x+2k+x+3k+x+4k+x+5k+x+6k=7x+21k
即(7x+21k)*52==n
另外,由于它有一个条件说要找x最大,k最小的情况,所以找x的时候就要从1开始往大找,k则往小找,如下
for(int i=1;i<=100;i++)
/*循环,因为要找x最大
的情况所以从1开始往后找*/
for(int j=200;j>=1;j--)
/*要找k最小的情况,所以
从200开始往前面找*/
你可能会疑惑:j不是没有给范围吗?
其实,你可以根据n和x的范围来判断k的范围,当n为最大值145600时,x和k都为100,可以看出k的最大值为100。 保险起见,我还是从200开始找的。
然后,再判断是否满足刚才所说的条件,如下
if(i*7+j*21==n/52)
满足条件,则将i和j的值给x和k,由于下一组数据会覆盖上一组,最后k就为最小值,x为最大。 最后,输出答案
完整代码如下
#include<iostream>//标准输入输出头
using namespace std;
int main()
{
int n,x,k;//定义一下
cin>>n;
for(int i=1;i<=100;i++)
/*循环,因为要找x最大
的情况所以从1开始往后找*/
{
for(int j=200;j>=1;j--)
/*要找k最小的情况,所以
从200开始往前面找*/
{
if(i*7+j*21==n/52)
//判断一下是否能正好攒够钱
{
x=i;//把i的值给x
k=j;//把j的值给k
/*由于后一组x和k的值会覆盖上一组,
所以最后输出的一定是
x最大,k最小的情况*/
}
}
}
cout<<x<<endl;//输出
cout<<k<<endl;
return 0;//好习惯别忘了
}