吐槽/心路历程

打开这道题的时候:*&@#%*#?!这不是小凯的疑惑吗?好像还是个加强版的?我疑惑了。原来$USACO$才是真的强,不知道什么时候随随便便就押中了题目。

对于我这种蒟蒻来说,这种有结论的题真是令人头疼,又不会证明,只能猜,要是猜错了就身败名裂了。

如果是考试的时候写这种题的话,我会直接上一个完全背包,并且价值不会开到题目骗我的那个$2,000,000,000$,差不多估摸着复杂度能过就这么写。

但是还是没搞懂为什么有一个上界,然后超过那个上界的答案会输出$0$(明明程序跑出来就是凑不了那么多啊)

就是这组数据:

4

252

250

254

256

上网看别人的题解我更疑惑了,都直接甩结论的啊喂,神仙啊,怎么想到的啊喂(ノ"◑ ◑)ノ"(。•́︿•̀。)

可能我这种数论渣渣在考场上只能猜结论然后暴力验证什么了


最后还是硬着头皮看了一波最强押题人$USACO$的英文官方题解(又开始折磨我这个英语渣渣了):

第一种做法:

一来就说如果不存在最大不能买到的块数,所有盒子大小的最大公约数大于$1$,先特判这种情况(也就是如果这一堆数的最大公因数不为1,就输出0)

然后从小到大进行更新,如果$X$能被凑出来,那么$X+V_i$也能被凑出来。

然后又开始甩结论了:如果有连续$256$个值都能被凑出来,那么从此之后所有的大小都可以被凑出来。

事实上,只要有连续的$min(V_i)$个值都能被凑出来,那么从此之后所有的大小都可以被凑出来。

(题外话:记笔记 短语  from here on out 从此以后)

所以...我还是要证结论?

先证这个吧:

只要有连续的$min(V_i)$个值都能被凑出来,那么从此之后所有的大小都可以被凑出来

设最小的那个数为$V_0$。

首先考虑特殊情况,特别地,如果从$1$到$V_0$都可以被凑出来的话,那么后面的数可以由$V_0*k$+前面凑出1到$V_0$的方法来凑($k$为正整数)

然后是一般情况,假设是从$i$到$i+V_0$都可以被凑出来,相同地,后面的数都可以用$V_0*k$++前面凑出$i$到$i+V_0$的方法来凑($k$为正整数)

那么问题来了,如果一直没有连续的$V_0$个数都能被凑出来怎么办呢?

那就是不存在不能买到块数的上限,也就是$gcd$特判的那种情况。

那么,再证公约数那个:

特殊情况:如果有$1$,所有的方案都能够被凑出来,输出$0$

考虑到能够被凑出来的数只能是$gcd$的倍数。因为每个数都可以被分解成为$k*gcd$的形式,能够被凑出来的数也可以被表达为$$m_1*k_1*gcd+m_2*k_2*gcd+m_3*k_3*gcd+...+m_n*k_n*gcd=gcd*(m_1*k_1+...+m_n*k_n)$$

一定是$gcd$的倍数。(要注意反过来不成立,$gcd$的倍数不一定能被凑出来

如果$gcd!=1$,那么被凑出来的数是不连续的,也就是没有上界。

如果$gcd==1$,当$i$(能够被凑出来的数从小到大排序形成的队列的项数(下标))足够大时,就会形成一串连续的数,当这一串连续的数达到了$V_0$个,就是之前讨论过的那种情况了。

想通之后还是不难吧。

 /*
ID: Starry21
LANG: C++
TASK: nuggets
*/
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 300005
bool f[N];
int n,a[];
int gcd(int x,int y)
{
if(y==) return x;
return gcd(y,x%y);
}
int main()
{
//freopen("nuggets.in","r",stdin);
//freopen("nuggets.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
sort(a+,a+n+);
int d=a[];
bool flag=;
for(int i=;i<=n;i++)
{
d=gcd(d,a[i]);
if(a[i]==) flag=;
}
if(flag||d>)
{
puts("");
return ;
}
int cnt=,j=,ans=;
f[]=;
while()
{
for(int i=;i<=n;i++)
{
if(j<a[i]) continue;
if(f[j-a[i]])
{
f[j]=,cnt++;
break;
}
}
if(!f[j]) cnt=,ans=j;
if(cnt==a[])
break;
j++;
}
printf("%d\n",ans);
}

Code


第二种做法:

就是小凯的疑惑。

确实疑惑,我太疑惑了,D1T1居然做了一个上午?还有半个月就考联赛了,退役算了哭唧唧。

第一种做法明白了之后,瞬间知道了开头那里为什么超过上界之后直接输出$0$,因为那就是$gcd>1$,不存在不能买到块数的上限。

(放了张图片,快要受不了这个老是吞掉我的数学公式的编辑器了,证明放在了小凯的疑惑里)

这里不是两个互质的数,但是即使我们只用两个数(可以感性理解,如果在这两个数上再多一些数,原来不能凑成的一些数就可以被凑成,上界(有一定概率)会缩小,所以只用两个数的上界是最大的),这两个数最大就是$256$,然后上界就是$256*256-2*256$,在这个范围内进行完全背包就可以了。如果最后出来的答案超过了上界,就是不存在不能买到块数的上限。

 /*
ID: Starry21
LANG: C++
TASK: nuggets
*/
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 512
#define M 65536
bool f[M+];
int n,a[];
int main()
{
freopen("nuggets.in","r",stdin);
freopen("nuggets.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
sort(a+,a+n+);
if(a[]==)
{
printf("0\n");
return ;
}
f[]=;
int temp;
for(int i=;i<=M;i++)
{
if(f[i])
for(int j=;j<=n;j++)
{
if(i+a[j]>M) continue;
f[i+a[j]]=;
}
else temp=i;
}
if(temp>M-N) temp=;
printf("%d\n",temp);
}

Code

第三种做法:

网上看到的,很高能,很佩服,可惜没有时间仔细研究(挖坑待填)

这里是超链接

总结

感觉第一种做法要顺理成章一些(虽然我写得不太顺理成章),在考虑凑数的时候手推一些什么性质的时候可能会想到发掘这些结论。而第二种做法对于我这种数学渣渣来说是不会在$dp$明显会挂掉的情况下用数学去分析范围的。

最后,发现了自己去年在洛谷上过的非常暴力的做法(年少无知),对,它过了;当然,在"严谨"的$USACO$上,它,过不了!

 /*
ID: Starry21
LANG: C++
TASK: nuggets
*/
#include<cstdio>
#include<algorithm>
using namespace std;
#define LIMIT 20000000
int n,a[],ans=-;
bool f[LIMIT];
int main()
{
freopen("nuggets.in","r",stdin);
freopen("nuggets.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
f[]=true;
for(int i=;i<=LIMIT;i++)
if(f[i])
for(int j=;j<=n;j++)
{
if(i+a[j]>LIMIT) continue;
f[i+a[j]]=true;
} else ans=i;
if(ans==-||ans>=LIMIT-) printf("");
else printf("%d",ans);
}

USACO4.1 Beef McNuggets【数学/结论】的更多相关文章

  1. 洛谷P2737 [USACO4.1]麦香牛块Beef McNuggets

    P2737 [USACO4.1]麦香牛块Beef McNuggets 13通过 21提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描 ...

  2. USACO Beef McNuggets

    洛谷 P2737 [USACO4.1]麦香牛块Beef McNuggets https://www.luogu.org/problem/P2737 JDOJ 1813: Beef McNuggets ...

  3. USACO 4.1 Beef McNuggets

    Beef McNuggetsHubert Chen Farmer Brown's cows are up in arms, having heard that McDonalds is conside ...

  4. [USACO4.1]麦香牛块Beef McNuggets

    https://www.luogu.org/problemnew/show/P2737 给出n个数ai,求这n个数不能累加出的最大的数 最大的数无限大或能凑出所有的自然数则输出0 n<=10,a ...

  5. Luogu 2737 [USACO4.1]麦香牛块Beef McNuggets

    NOIP2017 D1T1 的结论,两个数$a, b$所不能表示出的最大的数为$a * b - a - b$. 听了好几遍证明我还是不会 注意到本题中给出的数都非常小,所以最大不能表示出的数$\leq ...

  6. P2737 [USACO4.1]麦香牛块Beef McNuggets 数学题 + 放缩思想

    https://www.luogu.org/problem/show?pid=2737#sub 先说一个结论:对于两个数p, q,且gcd(p, q) = 1(这个很重要,是条件来的).他们不能组合成 ...

  7. [USACO4.1]麦香牛块Beef McNuggets By cellur925

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

  8. 洛谷 P2737 [USACO4.1]麦香牛块Beef McNuggets Label:一点点数论 && 背包

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

  9. [USACO4.1]麦香牛块Beef McNuggets 题解报告

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是"劣质的包装".& ...

随机推荐

  1. k8sReplicaSet控制器

    一.ReplicaSet概述 简称RS,是pod控制器类型的一种实现,用于确保由其管控的pod对象副本数在任一时刻都能精确满足期望的数量.ReplicaSet控制器资源启动后会查找集群中匹配其标签选择 ...

  2. 再提供一种解决Nginx文件类型错误解析漏洞的方法

    [文章作者:张宴 本文版本:v1.2 最后修改:2010.05.24 转载请注明原文链接:http://blog.zyan.cc/nginx_0day/] 注:2010年5月23日14:00前阅读本文 ...

  3. 绑定与非绑定以及property装饰器_day_21 作业题

    1.定义MySQL类 1.对象有id.host.port三个属性 2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一 3.提供两种实例化方式,方式一:用户传入host和po ...

  4. WTL自定义控件:需要的头文件

    这两天自定义了一个Edit控件,继承自CEdit,如下: class CCheckEditEx : public CWindowImpl< CCheckEditEx, CEdit > 需要 ...

  5. 【SQL-分组合并字符串】把相同分组的某个字段合并为同一个字符串(使用函数)

    场景:我要把同一个订单同一个客户同一个产品分组合并,同时把该产品所有的库位列举出来,合成一个字符串. 原始数据: 我要得到下面的结果: SQL如下: ==先建个方法== create function ...

  6. maven项目创建2

    添加依赖索引 但是默认是没有索引的,要手动创建索引 依赖范围 debug  配置 运行常见问题 处理办法,JDK重新安装 网络添加依赖网站

  7. Word:图片压缩

    造冰箱的大熊猫,本文适用于Microsoft Word 2007@cnblogs 2018/12/1 图片插入Word文档后,可以通过“裁剪”功能只显示图片的部分区域.虽然文档中显示的图片区域变小了, ...

  8. Ubuntu下搜狗输入法乱码(二)

    本文适用于Ubuntu 16.04,造冰箱的大熊猫@cnblogs 2018/10/25 搜狗输入法时不时出现候选字乱码的问题.参照网上所说的修改Fcitx配置中的简体中文和繁体中文转换配置的方法,无 ...

  9. 如何开始使用 Akka

    如果你是第一次开始使用 Akka,我们推荐你先运行简单的 Hello World 项目.情况参考  Quickstart Guide 页面中的内容来下载和运行 Hello World 示例程序.上面链 ...

  10. Map循环/迭代/遍历效率、性能问题。

    项目开发完毕,为了找点事打发一下时间,于是用findBugs插件对当前完工的项目进行扫描,发现了很多问题.其中有个关于性能的问题,在这里记录一下. 提示信息为:Inefficient use of k ...