HRBUST 1211 火车上的人数【数论解方程/模拟之枚举+递推】
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。
从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。
现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。
试问x站开出时车上的人数是多少?
Input有多组测试数据。
每组测试数据仅包含一行,每行包括四个整数,a,n,m和x。
0<= a <= 10
3<= n <= 30
1 <= x < n
0 <= m <= 2^31-1
Output对于每组测试数据,输出一行,包括一个整数,即从x站开出时车上的人数。Sample Input5 7 32 4Sample Output13
【分析】:
1.枚举第二站上下车的人数,根据题目给出的递推关系判断是否正确。递推关系题目描述得很清晰,数据规模也完全没有问题。
记第i站车上人数为f[i],上车人数为up[i],下车人数为down[i]
第一站人数为a则f[1]=a,up[1]=a,down[1]=0;
枚举第二站上下车的人k(0<=k<=m)
up[2]=down[2]=k;f[2]=f[1]+up[2]-down[2]=a;
第i站(3<=i<n):
up[i]=up[i-1]+up[i-2];
down[i]=up[i-1];
f[i]=f[i-1]+up[i]-down[i]
=f[i-1]+up[i-2];
由此我们第i站车上的乘客和down并没有关系
所以我们只要递推up和f
如果f[n-1]=m的话就得到了答案
————————————————————————————————————————————————————————
注意由于题目没有给出数据范围,不要把整个f和up开出来,直接使用临时变量递推
实际数据范围只要开到100就行
(不加优化即可过这道题,不过还是讲讲优化)
优化1
由于f是单调递增的可以二分查找
优化2
递推可以试试矩阵快速幂
【代码】:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000
using namespace std;
long long up[],down[],s[];
int main()
{
long long a,n,m,x,flag,i,j;
while(cin>>a>>n>>m>>x)
{
memset(s,,sizeof(s));
up[]=a;
flag=;
down[]=;
s[]=a;
for(i=;i<=m;i++)
{
up[]=i;
down[]=i;
s[]=s[];
for(j=;j<n;j++)
{
up[j]=up[j-]+up[j-];
down[j]=up[j-];
s[j]=s[j-]+up[j-];
}
if(s[n-]==m)
{
flag=;
printf("%lld\n",s[x]);
break;
}
}
}
return ;
}
枚举+递推
#include <bits/stdc++.h>
using namespace std;
int a,n,m,x;
int u[],c[];
int main()
{
cin>>a>>n>>m>>x;
u[]=a;
c[]=a;
c[]=a;
for(int k=;k<=m;k++)
{
u[]=k;
for(int i=;i<n;i++)
{
u[i]=u[i-]+u[i-];
c[i]=c[i-]+u[i-];
}
if(c[n-]==m)
{
cout<<c[x];
return ;
}
}
}
化简版
//数论
/*
* 第几站 上车 下车 车上人数
* 1 a1 0 a1
* 2 a2 a2 a1
* 3 a1+a2 a2 a1+a1
* 4 a1+a2+a2 a1+a2 a1+a1+a2
* 5 a1+a2+a1+a2+a2 a1+a2+a2 a1+a1+a2+a1+a2
* . . . .
* . . . .
* . . . .
* 到最后一站的人数就是m ,全部下完
* 思路,只要统计出a1个数和a2的个数就能求出a2,其中a1已经给出,m的数量就是n-1车站的开车的人数
* a2=(m-a1*a1的个数)/a2的个数
*/
#include<cstdio>
#include<cstring>
using namespace std;
int A[];
int B[];
void f(){
A[]=,A[]=,A[]=;
A[]=,A[]=;
for(int i=;i<=;i++)
A[i]=A[i-]+A[i-]-;
}
void ff(){
B[]=,B[]=,B[]=;
B[]=,B[]=;
for(int i=;i<=;i++)
B[i]=B[i-]+B[i-]+;
}
int main()
{
int a,n,m,x;
f();
ff();
while(~scanf("%d%d%d%d",&a,&n,&m,&x)){
int b[];
memset(b,,sizeof(b));
b[]=a;
b[]=a;
b[]=*a;
int xx=(m-A[n-]*a)/B[n-];
for(int i=;i<=;i++)
b[i]=A[i]*a+B[i]*xx;
printf("%d\n",b[x]);
}
return ;
}
学长出品,必属精品
HRBUST 1211 火车上的人数【数论解方程/模拟之枚举+递推】的更多相关文章
- NOI / 2.1基本算法之枚举-8759:火车上的人数
8759:火车上的人数 总时间限制: 1000ms 内存限制: 65536kB 描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下 ...
- 七牛云存储Python SDK使用教程 - 上传策略详解
文 七牛云存储Python SDK使用教程 - 上传策略详解 七牛云存储 python-sdk 七牛云存储教程 jemygraw 2015年01月04日发布 推荐 1 推荐 收藏 2 收藏,2.7k ...
- Struts2+Uploadify文件上传使用详解
Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例是php版本的,本文将详细介绍Uploadify在java中的使用,您也可以点击下面的链接进行演示或下 ...
- IE8“开发人员工具”使用详解上(各级菜单详解)
来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...
- luogu2312 解方程 (数论,hash)
luogu2312 解方程 (数论,hash) 第一次外出学习讲过的题目,然后被讲课人的一番话惊呆了. 这个题,我想着当年全国只有十几个满分.....然后他又说了句我考场A这道题时,用了5个模数 确实 ...
- vijos P1915 解方程 加强版
背景 B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜..... 为了安慰可怜的B酱, vijos刻意挂出来了真实的题目! 描述 已 ...
- MATLAB学习笔记(七)——MATLAB解方程与函数极值
(一)线性方程组求解 包含n个未知数,由n个方程构成的线性方程组为: 其矩阵表示形式为: 其中 一.直接求解法 1.左除法 x=A\b; 如果A是奇异的,或者接近奇异的.MATLAB会发出警告信息的. ...
- codevs3732==洛谷 解方程P2312 解方程
P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 已知多项式方程: a ...
- bzoj 3751: [NOIP2014]解方程 同余系枚举
3.解方程(equation.cpp/c/pas)[问题描述]已知多项式方程:a ! + a ! x + a ! x ! + ⋯ + a ! x ! = 0求这个方程在[1, m]内的整数解(n 和 ...
随机推荐
- 第5模块闯关CSS练习题
1.列举你知道的css选择器? 说道css选择器,大家都知道有许多种,但是真要你去掰着手指头数一数的话,你可能需要数几分钟.其实这么多选择器,完全可以分为两类: 标签选择器(*是特殊情况),可但标签, ...
- java多线程的常用方法
介绍一些多线程中的常用方法: //启动方法 a.start(); //返回代码正在被哪个线程调用的信息 a.currentThread(); //返回线程的名字 a.currentThread().g ...
- linux基础(基本命令)
Linux学习 1.Linux安装.配置 Linux的操作背景介绍 Linux操作系统 开源.自由且开发源代码的类Unix操作系统 厂商较多 著名的有R ...
- 微信小程序--问题汇总及详解之picker 增、删
<block wx:for="{{salesList}}" wx:for-index="index" wx:key="id" wx:f ...
- [转]完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
HTML5的语义化标签以及属性,可以让开发者非常方便地实现清晰的web页面布局,加上CSS3的效果渲染,快速建立丰富灵活的web页面显得非常简单. HTML5的新标签元素有: <header&g ...
- Log4j官方文档翻译(七、日志格式化)
apache log4j提供各种layout对象,然后根据自己指定的layouts对象转化日志信息.通常来说都是应用量身定制layout对象转换信息格式. 所有的layout对象从Appender对象 ...
- 服务器提交了协议冲突。Section=ResponseHeader Detail=标头名称无效
服务器提交了协议冲突.Section=ResponseHeader Detail=CR 后面必须是LF. 微软没有容忍不符合RFC 822中的httpHeader必须以CRLF结束的规定的服务器响应所 ...
- 计数(count)
计数(count) 题目描述 既然是萌萌哒 visit_world 的比赛,那必然会有一道计数题啦! 考虑一个 NN个节点的二叉树,它的节点被标上了 1∼N1∼N 的编号. 并且,编号为 ii的节点在 ...
- bzoj2338数矩形(rectangle)
数矩形(rectangle) 计算几何 把所有点两两连线,把这些线按长度排序,再按中点排序 能组成矩形的线一定是连续的 最坏就是所有点围成一个圆,交于圆心 复杂度O(可以过) 要用叉积,不然会被卡精 ...
- openssl Rsa 分段加密解密
密钥长度 1024 openssl genrsa -out rsa_private_key.pem openssl rsa -in rsa_private_key.pem -pubout -out r ...