文章目录

  • 题目
  • 思路
  • 代码

题目

https://atcoder.jp/contests/agc054/tasks/agc054_b

思路

怎么看,这题应该要DP,但是描述一个状态是很大问题:你怎么知道选了哪些橙子(共有 2 100 2^{100} 2100种情况)?

经过一番漫长的思考后,师父,我悟了!

其实,并不用描述选了哪些橙子,题目的关键就在排列 P P P和那两人拿橘子的顺序是一一对应的,比如说,Takahashi 依次取了1,5,2号橙子,Aoki依次取了4,3号橙子,那么,有且仅有一个 P P P和这种情况对应,且该 P P P只对应这种情况(用心体会下)

这样,问题就简单多了,设 f i f_i fi​表示拿了 i i i个橙子,且它们的重量和恰好等于所有橙子重量和的一半,的方案数.答案就应该是(别忘了取模):
a n s = ∑ i = 1 n f i ⋅ i ! ⋅ ( n − i ) ! ans=\sum^n_{i=1}f_i\cdot i!\cdot (n-i)! ans=i=1∑n​fi​⋅i!⋅(n−i)!
i ! i! i!是其中一个人拿橙子的顺序的方案数, ( n − i ) ! (n-i)! (n−i)!就是另一个人拿橙子的顺序的方案数

如何得到 f f f?

DP: f i , j f_{i,j} fi,j​表示拿了 i i i个橙子,总重量为 j j j的方案数,过程有点像背包问题,应该都会了吧

代码

#include <iostream>
#include <cstdio>
using namespace std;
#define N 110
#define ll long long
#define mod 998244353ll
ll f[N][10010];
ll n , w[N] , sumw;
ll fac[N];int main() {fac[0] = 1;for(int i = 1 ; i <= 100 ; i++)fac[i] = fac[i - 1] * i % mod;cin >> n;for(int i = 1 ; i <= n ; i++) {cin >> w[i];sumw += w[i];}if(sumw % 2 == 1) {cout << 0;return 0;}f[0][0] = 1;for(int i = 1 ; i <= n ; i++)//枚举第i个橙子for(int j = n ; j >= 0 ; j--)//一共j个橙子(除了i),注意倒叙枚举for(int k = sumw ; k >= 0 ; k--)//重量(除了i)f[j + 1][k + w[i]] += f[j][k],f[j + 1][k + w[i]] %= mod;ll ans = 0;for(int i = 1 ; i <= n ; i++)//求答案ans = (ans + fac[i] * fac[n - i] % mod * f[i][sumw / 2] % mod) % mod;cout << ans << endl;return 0;
}

ACG054 B - Greedy Division相关推荐

  1. RuntimeError: Integer division of tensors using div or / is no longer supported, and in a future rel

    RuntimeError: Integer division of tensors using div or / is no longer supported, and in a future rel ...

  2. from __future__ import absolute_import, division, print_function

    这三个函数的功能就是python2 为了适配python3格式做的补充,所以如果是python3的话,是不需要导入的. 不过,既然到这里了,那就说说这三个东西的用处. absolute_import ...

  3. 暴力枚举 UVA 725 Division

    题目传送门 1 /* 2 暴力:对于每一个数都判断,是否数字全都使用过一遍 3 */ 4 #include <cstdio> 5 #include <iostream> 6 # ...

  4. python from __future__ import division的作用

    1.在python2 中导入未来的支持的语言特征中division(精确除法),即from future import division ,当我们在程序中没有导入该特征时,"/"操 ...

  5. Arithmetic_Thinking -- greedy algorithm

    贪心算法--就是一种寻找局部最优解的情况,然后整合成整体最优解的情况 简单的例子:买菜的找钱,现在有1元,5角,1角的硬币,要找给别人2元7角,现在是怎么才能以最少的硬币量找给别人,肯定是先来两个1元 ...

  6. uva 725 Division(暴力模拟)

    Division 紫书入门级别的暴力,可我还是写了好长时间 = = [题目链接]uva 725 [题目类型]化简暴力 &题解: 首先要看懂题意,他的意思也就是0~9都只出现一遍,在这2个5位数 ...

  7. 数据结构与算法(C++)– 贪婪算法(Greedy algorithm)

    贪婪算法(Greedy algorithm) 1.基础 定义:贪婪算法分阶段地工作,在每一阶段,选择在当前最好的决策,不考虑将来的后果.所以一般只能得到局部最优而不是全局最优. 贪婪算法: Dijks ...

  8. JavaScript实现trial Division试除法算法(附完整源码)

    JavaScript实现trial Division试除法算法(附完整源码) trialDivision.js完整源代码 trialDivision.js完整源代码 export default fu ...

  9. CodeForces - 1497E2 Square-free division (hard version)(dp+数论)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,现在最多可以修改 kkk 个数字为任意数值,现在问最少可以将数列划分成多少个连续的数列,使得每一个单独的段中,任意两个数的乘积都不能是完全 ...

最新文章

  1. 聊聊 Linux 中的五种 IO 模型
  2. c语言实现字符指针(字符串)数组的排序
  3. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1068:与指定数字相同的数的个数
  4. mysql中对比月_详解Mysql中日期比较大小的方法
  5. 如何用Pygame写游戏(十六)
  6. magento xml配置详解(1)
  7. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第4节 模拟BS服务器案例_1_模拟BS服务器分析...
  8. 写作专用各种表情和符号,使你的文章更加美观有趣!❤️❤️❤️
  9. 小觅深度相机标准版 ROS使用
  10. 计算机cpu的功能和作用是什么意思,什么是中央处理器CPU
  11. KEIL MDK中的RO、RW和ZI DATA理解及KEIL中ROM和RAM使用大小计算
  12. 联发科:上半年营收2980亿台币,下半年全面发力5G芯片,并布局6G
  13. 【东方幻想乡系列模拟赛 Stage 4】 河城荷取
  14. 露营不在朋友圈,快乐在诗和远方
  15. linux转录组分析,完整转录组RNAseq分析流程(tophat2+cufflink+cuffdiff)
  16. NVENC SDK 设置h264编码的slice划分问题
  17. c# UTC时间和本地时间转换(北京时间)
  18. 【C语言/C++程序员编程】一小时做出来的数字雨(一颗开花的树)!
  19. 163企业邮箱注册申请,外贸企业邮箱首选什么邮箱呢?
  20. 面试容易紧张,有哪些小技巧可以缓解紧张呢?

热门文章

  1. Python文件独特行数
  2. 苹果爱奇艺会员怎么取消自动续费_淘宝省钱卡怎么取消自动续费?省钱卡有啥好处?...
  3. 如何关闭苹果手机自动扣费_如何在苹果手机里APP关闭连续包月续费会员?简单几步,切换自由...
  4. oppor7软件root,oppor7软件商店打不开怎么办
  5. asp按时间自动递增编号_Excel自动填充日期与每次递增3分钟的时间且批量生成编号,用快捷键填充当前日期...
  6. Kaiming He论文阅读笔记三——Simple Siamese Representation Learning
  7. ios 控件徽章_如何在iOS 8中正确设置应用程序徽章值?
  8. python实现淘宝自动回复_python实现代码审查自动回复消息
  9. 全国计算机应用技术证书文字处理,全国计算机用技术证书考试.doc
  10. 无人驾驶汽车系统入门(三)——无损卡尔曼滤波,目标追踪,C++