题目大意:
给定一个\(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)相关推荐

  1. [UOJ22]外星人

    题解 首先可以发现有效果的\(a_i\)大小一定是递减的,而且一定小于等于当前值 所以我们可以从大到小考虑每个\(a_i\),当确定了一个有效果的\(a_i\)时,\((a_i,x]\)的数都可以随意 ...

  2. 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 套路之:暴力递 ...

  3. [HAOI2012]外星人——数论欧拉函数

    题目描述 艾利欧在她的被子上发现了一个数字 NNN,他觉得只要找出最小的 xxx 使得 φx(N)=1\varphi^x(N)=1φx(N)=1 根据这个 xxx 她就能找到曾经绑架她的外星人的线索了 ...

  4. 外星人Alienware 17R4基本上可完美黑苹果10.13.6

    贡献者:RockJesus,感谢大佬不辞辛苦的努力,让17R4能够尝到近乎完美的黑苹果. 外星人Alinenware 17R4目前已经可以支持到黑苹果10.13.6系统了,来简单说一下要用到的东西. ...

  5. bzoj5314: [Jsoi2018]潜入行动【树形dp】

    Description 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY已经联系好了黄金舰队,打算联合所有JSO Ier抵御外星人的进攻.在黄金舰队就位之前,JYY打算事先了解外星人 ...

  6. Codeforces Gym100543L Outer space invaders 区间dp 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100543L.html 题目传送门 - CF-Gym100543L 题意 $T$ 组数据. 有 $n ...

  7. Luogu_P4766 [CERC2014]Outer space invaders【题解】区间DP

    题面:https://www.luogu.org/problem/P4766 非常容易就想到以时间为区间来DP. 但是时间比较大,需要离散化. 转移方程就是: f[l][r]=min(f[l][k-1 ...

  8. CERC2014 Outer spaceinvaders(区间DP,推理)

    有N个外星人,第i个外星人会在ai时间出现,离你距离di,并且必须在bi时间之前被消灭.你有一把很NB的武器,攻击范围是个半径为R的圆,R可以任意调整,不过你以R的范围每攻击一次就要消耗R单位能量.外 ...

  9. 【Luogu P4766】 [CERC2014]Outer space invaders(区间dp)

    目录 题目 题目描述 输入格式 输出格式 输入输出样例 思路 代码 题目 题目描述 来自外太空的外星人(最终)入侵了地球.保卫自己,或者解体,被他们同化,或者成为食物.迄今为止,我们无法确定. 外星人 ...

最新文章

  1. 8. 进制转化的函数
  2. WinAPI: CopyFileEx
  3. java blob压缩_如何从Oracle中用Java压缩的BLOB列中提取XML文档
  4. python弹出警告框_selenium+webdriver+python 中警告框的处理方法
  5. keep-alive和多路复用
  6. memcached—向memcached中保存Java实体需注意的问题
  7. 从用户洞察到数据应用 诸葛io让“增长”深入场景
  8. 命令 所有的虚拟环境_Python虚拟环境安装与配置
  9. windows 下pcl的安装和编译
  10. 技巧:删除桌面上提示找不到该项目的文件
  11. 解决后台传入的大于js最大数值精度的问题
  12. 使用win32API获取打印机是否处于脱机状态
  13. [字符串题-java实现]20. 有效的括号
  14. 计算机怎么配置IP地址,Windows系统如何给电脑设置IP地址
  15. python import变灰_python--pycharm中import导入包呈现灰色问题之解决~很实用
  16. 1-12月份英文简写
  17. android-support-percent的学习使用笔记
  18. 你不知道的 async、await 魔鬼细节
  19. Ubuntu16.04 C++安装opencv教程
  20. www.cjfx.net 读书人的网站 新华书业 崇文书城 新华之星

热门文章

  1. 使用MEF构建可扩展的Silverlight应用
  2. CSS滤镜 【转载】
  3. 前端真的能做到彻底权限控制吗?
  4. 电感是怎么储存能量的
  5. 直线分割平面(动态规划递推)
  6. streamsets rest api 转换 graphql
  7. lr录制脚本,用IETester代替IE浏览器
  8. 【JavaEE企业应用实战学习记录】struts配置文件详细解析
  9. Android开发(五)——计时器
  10. 专家观点:不断茁壮的音频生态系统中心(转)