• [NOI Online]文具订购


    这道题我是用O(1)(应该是)过的。66ms.

    先说说大概思路。因为他要尽量买成套的,所以就先用(n/14)记录之后再对(14)取模,接下来要做的就是对余数分类讨论

    特别的是,如果n==0,输出3个0,其他的n<3的情况即为无解。

    是的,就对于每一个余数分别讨论应该怎么输出。

    我们先用一个变量tmp存储下来(n/14)的值,余数记为(p)

    首先,如果没有余数,即p==0,我们就输出三个tmp即可。

    当p是3,4,7的整倍数的时候,看起来为了总样数最多,我们要尽可能的买啊!于是当时的思路就是,既然是整数倍,那么就买整数件那个物品。但是!!,因为7=3+4,在余数里面也只会出现7这一个7的倍数,所以我们应该分别购买一件3和一件4!

    当p为1,2,5的时候,我们不能直接拼凑出来,所以我们借一组来讨论。即tmp--,p+=14

    当p1,即p15,我们购买5件3,使总件数最大。

    当p2,即p16,我们购买4件3+1件4(不是4件4!)使总件数最大。

    当p5,即p19,我们购买5件3+1件4.

    剩下的还有10,11,13

    当p==10,我们购买2件3+1件4.

    当p==11,我们购买1件3+2件4.

    当p==13,我们购买3件3+1件4.

    这样打出来就全部完成了


    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    //	freopen("order.in","r",stdin);
    //	freopen("order.out","w",stdout);
        int n;
        cin>>n;
        if(!n)
    	{
    		puts("0 0 0");
    		return 0;
    	 } 
        if(n<3)
        {
            puts("-1");
            return 0;
        }
        int tmp=n/14;
        n%=14;
        if(n==0)
        {
            printf("%d %d %d
    ",tmp,tmp,tmp);
            return 0;
        }
        else
        {
            if(n%3==0)
            {
                printf("%d %d %d
    ",tmp,tmp,tmp+n/3);
                return 0;
            }
            else if(n%4==0)
            {
                printf("%d %d %d
    ",tmp,tmp+n/4,tmp);
                return 0;
            }
            else if(n%7==0)
            {
                printf("%d %d %d
    ",tmp,tmp+1,tmp+1);
                return 0;
            }
            else if(n==1)
            {
            	if(tmp)
            	{
            		tmp--;
                	printf("%d %d %d
    ",tmp,tmp,tmp+5);
    			}
                else puts("-1");
                return 0;
            }
            else if(n==2)
            {
            	if(tmp)
    			{
    				tmp--;
                	printf("%d %d %d
    ",tmp,tmp+1,tmp+4);
    			}
                else puts("-1");
                return 0;
            }
            else if(n==5)
            {
                if(tmp)
    			{
    				tmp--;
                	printf("%d %d %d
    ",tmp,tmp+1,tmp+5);
    			}
                else puts("-1");
                return 0;
            }
            else if(n==10)
            {
                printf("%d %d %d
    ",tmp,tmp+1,tmp+2);
                return 0;
            }
            else if(n==11)
            {
                printf("%d %d %d
    ",tmp,tmp+2,tmp+1);
                return 0;
            }
            else if(n==13)
            {
                printf("%d %d %d
    ",tmp,tmp+1,tmp+3);
                return 0;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    selenium中webDriver模块的常用方法
    java web Project Explorer误删解决方法
    java web开发前后端中文配置
    常见Filed Types
    类的展现
    面向对象:类与运算符
    面向对象定义类,属性
    筛选元素
    try : finally语句
    捕获异常try:except
  • 原文地址:https://www.cnblogs.com/moyujiang/p/12459594.html
Copyright © 2020-2023  润新知