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 和 ...
随机推荐
- Spark MLlib(下)--机器学习库SparkMLlib实战
1.MLlib实例 1.1 聚类实例 1.1.1 算法说明 聚类(Cluster analysis)有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可 ...
- Spring---基于Spring IOC的小程序
实现的功能以及各文件间的关系 IHelloMessage:一个接口,用于定义输出问候信息. HelloWorld.HelloChina:接口的实现类.在这里表示人在不同的地方 Person:一个人物类 ...
- S变换
哈哈,这两天在整理时频分析的方法,大部分参考网上写的比较好的资料,浅显易懂,在这谢过各位大神了! 今天准备写下S变换,由于网上资料较少,自己尝试总结下,学的不好,望各位多多指导 由前面的文章可知,傅里 ...
- tomcat内存泄漏存入dump文件
很多tomcat进程退出(或者进程假死),都是由于频繁的抛出OutOfMemeoryError导致的. 为了让tomcat退出前或者发生OutOfMemeoryError时自动dump堆栈信息,方便事 ...
- ECMAScript5.1
http://lzw.me/pages/ecmascript/ ECMAScript5.1中文版 https://msdn.microsoft.com/zh-cn/library/dn656907. ...
- 设计模式之第4章-装饰模式(Java实现)
设计模式之第4章-装饰模式(Java实现) “怎么了,鱼哥?” “唉,别提了,网购了一件衣服,结果发现和商家描述的差太多了,有色差就算了,质量还不好,质量不好就算了,竟然大小也不行,说好的3个X,邮的 ...
- IOS开发---菜鸟学习之路--(一)
PS(废话): 看了那么多的博客文章,发现大部分人都一直在强调写技术博客的重要性,索性自己也耐着性子写写看吧. 写博客的重要性之类的说明,我就不做复制黏贴的工作了.因为自己没有写过多少,所也不清楚是不 ...
- MFC深入浅出读书笔记第二部分2
第七章 MFC骨干程序 所谓骨干程序就是指有AppWizard生成的MFC程序.如下图的层次关系是程序中常用的几个类,一定要熟记于心. 1 Document/View应用程序 CDocument存放 ...
- python 学习分享-实战篇简单的ftp
import socket import os import time import pickle Basedb = os.path.dirname(os.path.dirname(os.path.a ...
- 使用 宝塔面板快速部署Java项目
环境描述: 服务器系统:CentOS7 64位操作系统 面板版本:宝塔6.9.4 Nginx版本:Nginx 1.16 Tomcat版本:Tomcat7 JDK版本:1.8.0_121 环境部署就不用 ...