题解 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;//好习惯别忘了
}

本蒟蒻的第七篇题解,如有不足之处,请各位大佬指正