[noip2013]小朋友的数字(dp+规律)
2017-10-31 11:38
267 查看
题目:
我是超链接题解:
无dp暴力:60pts不行啊这个n^2,我还是用dp吧,f[i]表示前i个手上的数(必选i)的最大值:80pts
Emmm看来是爆longlong了。。确实有一个比longlong更大的,但是我们还是用科学的方法吧
很容易发现特征值是不降的,那么也可以发现分数是不降的
如果上一位的特征值小于0,那上一位肯定带不来什么好贡献,并且也可以知道前面的特征值全都是小于0的常数列(除第一位),那这一位小朋友的分数就是第二位小朋友的分数
如果上一位的特征值大于0,那肯定会增加贡献,就直接是上一位小朋友的特征值+分数
最后还需要比较一下最大的小朋友和第一位小朋友的值,正因为要找到最大的小朋友,我们不能在更新值的时候直接取模,还要先确认比第一位小朋友大
代码:
#include <cstdio> #include <iostream> #include <cstring> #define LL long long #define N 1000005 using namespace std; const LL INF=1e18; LL ss ,tz ,fs ,f ,p; int main() { int n,i,j; scanf("%d%lld",&n,&p); for (i=1;i<=n;i++) scanf("%lld",&ss[i]); tz[1]=f[1]=ss[1]; for (i=2;i<=n;i++) { f[i]=ss[i]+max(0ll,f[i-1]); tz[i]=max(tz[i-1],f[i]); } bool vv=0; fs[1]=ss[1];fs[2]=ss[1]*2; if (fs[1]<=fs[2]) vv=1; for (i=3;i<=n;i++) if (tz[i-1]>0) { fs[i]=tz[i-1]+fs[i-1]; if (fs[i]>=fs[1]) vv=1; if (fs[i]>INF) fs[i]%=p; } else fs[i]=fs[2]; if (!vv) printf("%lld",fs[1]%p); else printf("%lld",fs %p); }
相关文章推荐
- noip2013小朋友的数字(dp)
- [NOIP2013][vijos1850]小朋友的数字(dp+贪心)
- |Tyvj|NOIP2013|动态规划|P3074 小朋友的数字
- 【NOIP2013普及组真题】小朋友的数字
- [DP]NOIP2013 PJ 小盆友的数字
- NOIP 2013 小朋友的数字
- ◆竞赛题目◆◇NOIP2013普及组◇ 小朋友的数字
- NOIP2013pj小朋友的数字[DP 最大子段和]
- noip2013 小朋友的数字 (最大子区间和+动态规划)
- 【noip2013普及】 小朋友的数字
- jzoj3501 【NOIP2013模拟联考15】消息传递(news) 树形dp
- 【noip2013】花匠 DP||贪心
- [jzoj]3472. 【NOIP2013模拟联考8】匹配(match)(AC自动机+DP)
- [jzoj]3482. 【NOIP2013模拟10.23】轮舞前夕(经典树形DP)
- [NOIP 2013]花匠 DP
- [jzoj]3427. 【NOIP2013模拟】归途与征程(字符串DP+贪心)
- [NOIP2013][vijos1845]花匠(dp+bit)
- [jzoj]3511. 【NOIP2013模拟11.5A组】cza的蛋糕(cake)(DP嵌套dfs【快】或DP【慢】)
- 【NOIP2013模拟联考12】数数(数位dp||类欧几里得)
- JZOJ5379. 【NOIP2017提高A组模拟9.21】Victor爱数字 数位DP