poj 3863&&Gym - 101308B Business Center (水题/推公式)

题意:给你 m 个电梯,每个电梯有两个按钮, u 和 d ,分别代表上 u 层,和下 d 层,每一次你都从第0层开始做电梯,你可以按这个电梯按钮 m 次,假设楼层无限高,问你可以到达的最低楼层是多少,0层除外?

思路:

我们假设按 上走 x 次, 那么下走为 (n-x) 次

那么可以到达的楼层为 k = a*x - b*(n-x)

另上式等于0,我们可以得到当 x‘= b*n/(a+b) 时为第0层

由于 x 必须为正整数,我们对 x‘ 向上取整,就得到可以到达的最低楼层

但是现在有一个漏洞,如果 x‘ 就是一个正整数,那么我们向上取整后还是x‘本身

遇到这种情况此时的x‘=x‘+1,也就是说我们就多上一层少下一层,就能避开到达0层了

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <list>
#include <bitset>
#include <stack>
#define lowbit(x) (x&-x)
using namespace std;
int main()
{
    freopen("business.in","r",stdin);
    freopen("business.out","w",stdout);
    long long n,m;
    while( cin>>n>>m)
    {
        long long ans = 0x3f3f3f3f3f;
        while(m--)
        {
            long long a,b;
            cin>>a>>b;
            double tmp = b*n*1.0/(a+b);
            long long x = ceil(tmp);
            long long fuck = a*x-b*(n-x);
            if(fuck==0) fuck = a*(x+1)-b*(n-x-1);
            ans=min(ans,fuck);
        }
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-10-20 13:57:37

poj 3863&&Gym - 101308B Business Center (水题/推公式)的相关文章

POJ 2545+2591+2247+1338简单水题

[题意简述]:就是有这样的一个序列,就拿当p1 = 2,p2 = 3, p3 = 5,来举例,由这三个数为基准组成的序列是: 2,3,4,5,6,8,9,10,12--现在给你这个序列数组的下标,让你求得这个数组中,这个下标里的数是多少. [分析]:2,3,4,5,6,8,9,10,12--这个序列式由2,3,5这三个数生成的,具体如何生成,就是: 详见代码: 这里以POJ2545为例: //弄清其中的逻辑关系,可以从最简单的2,3,5试着做起! #include<iostream> #inc

POJ 3069 Saruman&#39;s Army(水题,简单的贪心)

[题意简述]:在一条直线上有N个点,每个点的位置分别是Xi,现从这N个点中选择若干个点给他们加上标记.使得,对每个点而言,在其距离为R的范围内都有带有标记的店,问   至少   要有几个被标记的点. [分析]:我们可以对这个点的序列简单的排序,按照从左到右,从小到大,然后对于最左边的这一个点,我们计算从这个点开始加上这个距离R可以到达的最远的但又小于这个距离R的点是哪一个,然后以这个点为基准,重复上述的过程,最终计算出点的个数. 详见代码: //244K 63Ms #include<iostre

POJ 2081 Recaman&#39;s Sequence(水题)

[题意简述]:这个题目描述很短,也很简单.不再赘述. [分析]:只需再加一个判别这个数是否出现的数组即可,注意这个数组的范围! // 3388K 0Ms #include<iostream> using namespace std; #define Max 500001 int a[Max]; bool b[10000000] = {false}; // b的数据范围是可以试出来的- void init() { a[0] = 0; b[0] = true; for(int m = 1;m<

Goldbach&#39;s Conjecture POJ - 2262 线性欧拉筛水题 哥德巴赫猜想

题意 哥德巴赫猜想:任一大于2的数都可以分为两个质数之和 给一个n 分成两个质数之和 线行筛打表即可 可以拿一个数组当桶标记一下a[i]  i这个数是不是素数  在线性筛后面加个装桶循环即可 #include<cstdio> #include<cstring> using namespace std; bool Is_Primes[1000005]; int Primes[1000005]; int cnt; void Prime(int n){ cnt=0; memset(Is_

poj 3103 Cutting a Block 模拟水题

水题 #include <iostream> using namespace std; int main() { int x,y,z,n; scanf("%d%d%d%d",&x,&y,&z,&n); for(int i=0;i<n;++i) printf("0 0 %.8lf %d %d %.8lf\n",(z*1.0/n)*i,x,y,(z*1.0/n)*(i+1)); return 0; } 版权声明:本文为博

POJ 2070 Filling Out the Team(水题)

[题目简述]:给出了球场上WideReceiver,Lineman,Quarterback三个位置所需人员的最低属性(speed,weight ,strength)要求,输入:三个数据,为别为speed.weight.strength,若输入的速度低于或等于球场上位置的要求,体重和力量大于或等于球场上位置的要求,则输出相应的符合位置,若有多个符合的位置,中间用一个空格隔开输出,如没有符合位置,则输出 No positions. [分析]:很简单,但是,对于我的代码还是有个疑问,就是拿题目中前两个

Codeforces gym 100685 C. Cinderella 水题

C. CinderellaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/C Description Cinderella is given a task by her Stepmother before she is allowed to go to the Ball. There are N (1 ≤ N ≤ 1000) bottles with water in th

Gym 100851E Easy Problemset (水题,模拟)

题意:给定 n 个裁判,然后每个都一些题目,现在要从每一个按顺序去选出 k 个题,并且这 k 个要按不递减顺序,如果没有,就用50补充. 析:就按他说的来,直接模拟就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #

POJ 1936 All in All 匹配, 水题 难度:0

题目 http://poj.org/problem?id=1936 题意 多组数据,每组数据有两个字符串A,B,求A是否是B的子串.(注意是子串,也就是不必在B中连续) 思路 设置计数器cnt为当前已匹配A的长度,明显在扫描B的过程中只需要记住cnt这一个状态. 扫描B,每次与A[cnt]匹配就将计数器增加1,cnt与A的长度一致时A就是B的子串. 感想 这道题也许可以用更复杂的方法. 代码 1 #include <cstdio> 2 #include <cstring> 3 #i