codeforces 712d
来源:互联网 发布:万方数据库收费吗 编辑:程序博客网 时间:2024/05/21 07:24
题意:就是a,b玩游戏,a的起始分数为a,b的起始分数为b,每一轮两个都随机加 [-k k]的一个数 问你a比b的结果有几种
思路:因为两个人不互相干扰 看了一下数据范围 直接记下了每一轮的状态 即dp[i][j]表示第i轮有j分数有多少 最后比较一下
ps:虽然很容易想 但是太暴力了 一点都不优雅 后来发现有很简单的快的方法
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;#define LL long long#define MAX 300000#define MID 150000#define MOD 1000000007LL dp1[105][MAX];LL dp2[105][MAX];LL l[MAX];LL r[MAX];int main(){ int a,b,k,t; scanf("%d%d%d%d",&a,&b,&k,&t); dp1[0][MID+a]=1; for(int i=1;i<=t;i++) { int up=a+k*i+MID; int down=a-k*i+MID; for(int j=down;j<=up;j++) { l[j]=(dp1[i-1][j]+l[j-1]-dp1[i-1][j-k-1])%MOD; } for(int j=up;j>=down;j--) { r[j]=(dp1[i-1][j]+r[j+1]-dp1[i-1][j+k+1])%MOD; } for(int j=down;j<=up;j++) { dp1[i][j]=(l[j]+r[j]-dp1[i-1][j])%MOD; } } memset(l,0,sizeof(l)); memset(r,0,sizeof(r)); dp2[0][MID+b]=1; for(int i=1;i<=t;i++) { int up=b+k*i+MID; int down=b-k*i+MID; for(int j=down;j<=up;j++) { l[j]=(dp2[i-1][j]+l[j-1]-dp2[i-1][j-k-1])%MOD; } for(int j=up;j>=down;j--) { r[j]=(dp2[i-1][j]+r[j+1]-dp2[i-1][j+k+1])%MOD; } for(int j=down;j<=up;j++) { dp2[i][j]=(l[j]+r[j]-dp2[i-1][j])%MOD; } } LL sum=0; LL ans=0; int up=a+k*t+MID; int down=b-k*t+MID; for(int i=down;i<=up;i++) { ans=(ans+dp1[t][i]*sum)%MOD; sum=(sum+dp2[t][i])%MOD; } ans=(ans+MOD)%MOD; printf("%lld\n",ans); return 0;}
0 0
- codeforces 712D
- codeforces 712d
- CodeForces 712D Memory and Scores
- CodeForces 712D Filya and Homework
- 【26.87%】【codeforces 712D】Memory and Scores
- codeforces 712D Memory and Scores (dp)
- CodeForces 617D CodeForces 617D
- CodeForces 101D
- CodeForces 103D
- CodeForces 222D Olympiad
- codeforces 242d
- CodeForces 111D
- 【codeforces】3D
- CodeForces 127D Password
- codeforces 257D. Sum
- Codeforces 292D
- Codeforces 275D
- Codeforces 126D
- android 数字计算精度丢失问题
- 双向关联一对一映射详解(2)
- leetcode 25.Reverse Nodes in k-Group
- 调试bug常用的方法
- 多项式拟合的几点思考(1)
- codeforces 712d
- 双向关联一对一映射详解(1)
- Android 通过URI加载网络图片bitmap
- 追求
- 分享自己找工作的一些经历心得
- 博客资源
- 我的servlet学习过程(四):JSP部分
- 单向一对一映射
- 多对多