zoukankan      html  css  js  c++  java
  • USACO 4.1 Beef McNuggets

    Beef McNuggets
    Hubert Chen

    Farmer Brown's cows are up in arms, having heard that McDonalds is considering the introduction of a new product: Beef McNuggets. The cows are trying to find any possible way to put such a product in a negative light.

    One strategy the cows are pursuing is that of `inferior packaging'. ``Look,'' say the cows, ``if you have Beef McNuggets in boxes of 3, 6, and 10, you can not satisfy a customer who wants 1, 2, 4, 5, 7, 8, 11, 14, or 17 McNuggets. Bad packaging: bad product.''

    Help the cows. Given N (the number of packaging options, 1 <= N <= 10), and a set of N positive integers (1 <= i <= 256) that represent the number of nuggets in the various packages, output the largest number of nuggets that can not be purchased by buying nuggets in the given sizes. Print 0 if all possible purchases can be made or if there is no bound to the largest number.

    The largest impossible number (if it exists) will be no larger than 2,000,000,000.

    PROGRAM NAME: nuggets

    INPUT FORMAT

    Line 1: N, the number of packaging options
    Line 2..N+1: The number of nuggets in one kind of box

    SAMPLE INPUT (file nuggets.in)

    3
    3
    6
    10
    

    OUTPUT FORMAT

    The output file should contain a single line containing a single integer that represents the largest number of nuggets that can not be represented or 0 if all possible purchases can be made or if there is no bound to the largest number.

    SAMPLE OUTPUT (file nuggets.out)

    17

    ————————————————————————————
    这道题要想到一点就是ax+by=gcd(a,b)

     Print 0 if all possible purchases can be made or if there is no bound to the largest number.

    The largest impossible number (if it exists) will be no larger than 2,000,000,000.

    这句话,输出0如果所有的方案都可以满足或者不存在最大数的上限,最大的可能数如果存在不超过2,000,000,000。

    请记住红字,并且不要被范围吓到,因为范围要自己推出来

    首先的首先,我们发现如果所有数的gcd不等于1,那么肯定有的数无法得到,所以此时是0。

    然后开始讨论gcd是1时的范围

    ax+by=1;|by|-|ax|=1;那么我们得到一个|ax|和一个|by|,他们差值1,得到长度为2的一个可取数范围,我们用他们自身再次累加,会发现得到长度为3的可取数范围

    当这个范围==最小的包装内牛块,我们就发现后面的数都可以得到了

    然后这个范围最大也就是256*256,不是20亿啦……【谁会一次性买20亿牛块啊喂……】

    所以复杂度是O(256*256*10)然后直接dp就好了

     1 /*
     2 ID: ivorysi
     3 PROG: nuggets
     4 LANG: C++
     5 */
     6 #include <iostream>
     7 #include <cstdio>
     8 #include <cstring>
     9 #include <algorithm>
    10 #include <queue>
    11 #include <set>
    12 #include <vector>
    13 #include <string.h>
    14 #define siji(i,x,y) for(int i=(x);i<=(y);++i)
    15 #define gongzi(j,x,y) for(int j=(x);j>=(y);--j)
    16 #define xiaosiji(i,x,y) for(int i=(x);i<(y);++i)
    17 #define sigongzi(j,x,y) for(int j=(x);j>(y);--j)
    18 #define inf 0x3f3f3f3f
    19 #define MAXN 400005
    20 #define ivorysi
    21 #define mo 97797977
    22 #define ha 974711
    23 #define ba 47
    24 #define fi first
    25 #define se second
    26 #define pii pair<int,int>
    27 using namespace std;
    28 typedef long long ll;
    29 int num[15],s,dp[70005];
    30 int n,now,ans;
    31 int gcd(int a,int b) {return b==0 ? a : gcd(b,a%b);}
    32 void solve(){
    33     scanf("%d",&n);
    34     siji(i,1,n) {
    35         scanf("%d",&num[i]);
    36         if(s==0) s=num[i];
    37         else s=gcd(s,num[i]);
    38     }
    39     if(s!=1) {
    40         puts("0");exit(0);
    41     }
    42     sort(num+1,num+n+1);
    43     dp[0]=1;
    44     for(int i=1;i<=33000;++i) {
    45         siji(j,1,n) {
    46             if(i-num[j]>=0) {
    47                 dp[i]=max(dp[i],dp[i-num[j]]);
    48             }
    49             else break;
    50         }
    51         if(dp[i]==0) ans=i;
    52     }
    53     printf("%d
    ",ans);
    54 
    55 }
    56 int main(int argc, char const *argv[])
    57 {
    58 #ifdef ivorysi
    59     freopen("nuggets.in","r",stdin);
    60     freopen("nuggets.out","w",stdout);
    61 #else
    62     freopen("f1.in","r",stdin);
    63 #endif
    64     solve();
    65 }
     
  • 相关阅读:
    201621123059《Java程序设计》第二周学习总结
    学习计划表
    201621123059《java程序设计》第一周学习总结
    C语言I作业06
    C语言I博客作业05
    C语言I博客作业04
    志勇的C语言I博客作业03
    志勇的C语言I博客作业02
    志勇的第一周作业
    pdf文件完美转换技巧分享
  • 原文地址:https://www.cnblogs.com/ivorysi/p/6279637.html
Copyright © 2011-2022 走看看