uoj22 外星人(dp)
题目大意:
给定一个\(n\)个数的序列\(a\),给定一个\(x\),其中\(a\)数组可以进行顺序的调换,每一个\(a_i\)都能使$x=x \mod a_i \(, 求最后经过一系列计算后的\)y\(,满足\)abs(x-y)$尽可能小,并求出方案数
QwQ 哇,一看到这个题。说实话,没什么好的思路。
也就发现了几个性质:
1.最后的\(y\)一定小于最小的\(a_i\)
2.如果存在一个\(a_i<a_j\),且\(i<j\) 那么\(a_j\)就没有任何作用了,对答案没有任何一点影响
那我们不妨将整个数组从大到小排序
先考虑第一问:
我们定义\(f[i][j]\)表示,考虑到第\(i\)个数,当前的值为\(j\)是否可行,首先我们令\(f[0][x]=1\),然后对于当前的\(i\),我们可以选择用它 ,也可以选择不用(换句话说,就是放一个比它更小的在前面,就可以实现不使用它了)但是后者需要满足\(i\ !=n\) 然后分别对应转移即可
这里有部分分的代码!
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>using namespace std;const int maxn = 1010;
const int maxx = 5010;int f[maxn][maxx];
int a[maxn];
int n,x;inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}bool cmp(int a,int b)
{return a>b;
}int main()
{n=read(),x=read();for (int i=1;i<=n;i++) a[i]=read();sort(a+1,a+1+n,cmp);f[0][x]=1;for (int i=1;i<=n;i++){for (int j=0;j<=x;j++) f[i][j%a[i]]=max(f[i][j%a[i]],f[i-1][j]);if (i!=n) for (int j=0;j<=x;j++) f[i][j]=max(f[i][j],f[i-1][j]);}for (int i=x;i>=0;i--) if (f[n][i]) {cout<<i<<endl<<0<<endl;return 0;}return 0;
}
那么加上第二问呢,该怎么解决呢。
看了一些排列组合的题解,不过并不知道怎么做呀。倒是有一种更好理解的方法QwQ
我们令\(g[i][j]\)表示处理第\(i\)个数,当前值是\(j\)的方案数
如果我们使用这个点\(g[i][j \mod a_i ]+=g[i-1][j]\)(说明他待在当前的位置,且后面比他小的位置,都在他后面
如果不用\(g[i][j]=g[i-1][j]*(n-i)\) (表示他可以和他之后的任意一个比他小的数换位置,都不会使用这个点)(或者理解为他有\(n-i\)个空隙可以插进去
直接上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}const int maxn = 1010;
const long long mod = 998244353;int f[maxn][5010];
long long g[maxn][5010];
int n,x;
int a[maxn];bool cmp (int a,int b)
{return a>b;
}int main()
{scanf("%d%d",&n,&x);for (int i=1;i<=n;i++) a[i]=read();f[0][x]=1;g[0][x]=1;sort(a+1,a+1+n,cmp);for (int i=1;i<=n;i++){for (int j=0;j<=x;j++) f[i][j%a[i]]=max(f[i][j%a[i]],f[i-1][j]),g[i][j%a[i]]=(g[i][j%a[i]]+g[i-1][j])%mod;if (i!=n) for (int j=0;j<=x;j++) f[i][j]=max(f[i][j],f[i-1][j]),g[i][j]=(g[i][j]+g[i-1][j]%mod*(long long)(n-i)%mod)%mod; } for(int i=a[n];i>=0;i--){if (f[n][i]){cout<<i<<endl;cout<<g[n][i]<<endl;return 0;}}return 0;
}
转载于:https://www.cnblogs.com/yimmortal/p/10160839.html
uoj22 外星人(dp)相关推荐
- [UOJ22]外星人
题解 首先可以发现有效果的\(a_i\)大小一定是递减的,而且一定小于等于当前值 所以我们可以从大到小考虑每个\(a_i\),当确定了一个有效果的\(a_i\)时,\((a_i,x]\)的数都可以随意 ...
- leetcode 123. Best Time to Buy and Sell Stock III | 123. 买卖股票的最佳时机 III(总结DP 模型套路)
题目 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/ DP 模型套路 DP 套路之:暴力递 ...
- [HAOI2012]外星人——数论欧拉函数
题目描述 艾利欧在她的被子上发现了一个数字 NNN,他觉得只要找出最小的 xxx 使得 φx(N)=1\varphi^x(N)=1φx(N)=1 根据这个 xxx 她就能找到曾经绑架她的外星人的线索了 ...
- 外星人Alienware 17R4基本上可完美黑苹果10.13.6
贡献者:RockJesus,感谢大佬不辞辛苦的努力,让17R4能够尝到近乎完美的黑苹果. 外星人Alinenware 17R4目前已经可以支持到黑苹果10.13.6系统了,来简单说一下要用到的东西. ...
- bzoj5314: [Jsoi2018]潜入行动【树形dp】
Description 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY已经联系好了黄金舰队,打算联合所有JSO Ier抵御外星人的进攻.在黄金舰队就位之前,JYY打算事先了解外星人 ...
- Codeforces Gym100543L Outer space invaders 区间dp 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100543L.html 题目传送门 - CF-Gym100543L 题意 $T$ 组数据. 有 $n ...
- Luogu_P4766 [CERC2014]Outer space invaders【题解】区间DP
题面:https://www.luogu.org/problem/P4766 非常容易就想到以时间为区间来DP. 但是时间比较大,需要离散化. 转移方程就是: f[l][r]=min(f[l][k-1 ...
- CERC2014 Outer spaceinvaders(区间DP,推理)
有N个外星人,第i个外星人会在ai时间出现,离你距离di,并且必须在bi时间之前被消灭.你有一把很NB的武器,攻击范围是个半径为R的圆,R可以任意调整,不过你以R的范围每攻击一次就要消耗R单位能量.外 ...
- 【Luogu P4766】 [CERC2014]Outer space invaders(区间dp)
目录 题目 题目描述 输入格式 输出格式 输入输出样例 思路 代码 题目 题目描述 来自外太空的外星人(最终)入侵了地球.保卫自己,或者解体,被他们同化,或者成为食物.迄今为止,我们无法确定. 外星人 ...
最新文章
- 8. 进制转化的函数
- WinAPI: CopyFileEx
- java blob压缩_如何从Oracle中用Java压缩的BLOB列中提取XML文档
- python弹出警告框_selenium+webdriver+python 中警告框的处理方法
- keep-alive和多路复用
- memcached—向memcached中保存Java实体需注意的问题
- 从用户洞察到数据应用 诸葛io让“增长”深入场景
- 命令 所有的虚拟环境_Python虚拟环境安装与配置
- windows 下pcl的安装和编译
- 技巧:删除桌面上提示找不到该项目的文件
- 解决后台传入的大于js最大数值精度的问题
- 使用win32API获取打印机是否处于脱机状态
- [字符串题-java实现]20. 有效的括号
- 计算机怎么配置IP地址,Windows系统如何给电脑设置IP地址
- python import变灰_python--pycharm中import导入包呈现灰色问题之解决~很实用
- 1-12月份英文简写
- android-support-percent的学习使用笔记
- 你不知道的 async、await 魔鬼细节
- Ubuntu16.04 C++安装opencv教程
- www.cjfx.net 读书人的网站 新华书业 崇文书城 新华之星