题目描述

某天Lemon去超市买柠檬,他发现货架上有N个柠檬,每个柠檬都有一个重量Wi和价格Ci。

Lemon身上只带了S元钱,因此他想要买一个价格不超过S的柠檬回家,另外,他希望他买的那个柠檬的性价比尽量高。

性价比的定义是重量除以价格,即第i个柠檬的性价比是Wi/Ci。你的任务是告诉Lemon,他应该买第几个柠檬。

输入输出格式

输入格式

输入文件第一行包含两个正整数N,S。

输入文件第2~N+1行,每行包含两个正整数Wi、Ci,第i+1行的数表示第i个柠檬的重量和价格。

输出格式

输输出文件第一行仅包含一个数K,表示购买第K只柠檬能使Lemon在可以接受的价格内获得最高的性价比。题目保证答案唯一。

样例

INPUT

4 15

4 8

4 10

8 10

10000 20

OUTPUT

3

HINT

样例解释 Sample Explanation:

第1只柠檬重量为4,价格为8,性价比为4/8=0.5;

第2只柠檬重量为4,价格为10,性价比为4/10=0.4;

第3只柠檬重量为8,价格为10,性加比为8/10=0.8;

第4只柠檬重量为10000,价格为20,性价比为10000/20=500,但Lemon只带了15元,无法购买这只柠檬。

因此Lemon的最佳选择是第3只柠檬。

数据范围 Data Range:

对于100%的数据,满足:0<n≤100000;0<s≤109;0<wi、ci≤109;

n,s,w,c均为整数。

SOLUTION

傻蛋坑题。

这题把坑拿掉顶多就是普及-的难度。

如果数据是\(10^9\)的数量级的话就必须考虑一下精度问题,因为我们一般使用的double类型的有效位数为15位,所以考虑简单转化:$$\frac{w_i}{c_i}>\frac{w_{rec}}{c_{rec}}$$等效于$$w_i\cdot c_{rec}>w_{rec}\cdot c_i$$

这样的话就只要改成long long就好了,以乘代除来保证精度的技巧以前也出现过,并没有重视,所以应该是一个比较好的教训了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef long long LL;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-48;ch=getchar();}
return x*f;}
int n,S,ans=0;
LL recw=0,recc=0;
inline LL gcd(LL x,LL y) {return (!y)?x:gcd(y,x%y);}
int main(){
//freopen("market.in","r",stdin);
//freopen("market.out","w",stdout);
int i,j;
n=read();S=read();
for (i=1;i<=n;++i) {LL w=read(),c=read();if (c>S) continue;
LL g=gcd(w,c);w/=g;c/=g;if (!ans) {recw=w;recc=c;ans=i;continue;}
LL now=w*recc,rec=c*recw;if (now>rec) {recw=w;recc=c;ans=i;}
}//直接踩中了这题的雷,直接除的话会爆精度
printf("%d\n",ans);
return 0;
}

JXJJOI2018_T1_market的更多相关文章

随机推荐

  1. zip和rar文件的contentType

    zip.rar.msi等文件使用Chrome提交的ContentType都为null,IE可以正确获取

  2. kafka Poll轮询机制与消费者组的重平衡分区策略剖析

    注意本文采用最新版本进行Kafka的内核原理剖析,新版本每一个Consumer通过独立的线程,来管理多个Socket连接,即同时与多个broker通信实现消息的并行读取.这就是新版的技术革新.类似于L ...

  3. NOIP复赛文件路径怎么写

    以2018年NOIP普及组复赛为例,四道题对应着四个文件夹:   随便选一道题,比如第一道题,进入title目录,可以看到title1.in, title1.ans, title2.in, title ...

  4. Linux分区挂载

    Liunx采用树形的文件管理系统,也就是在Linux系统中,可以说已经没有分区的概念了.分区在Linux和其他设备一样都只是一个文件.要使用一个分区必须把它加载到文件系统中.这可能难于理解,继续往下看 ...

  5. 【ccf- csp201412-2】z字形扫描

    //ccf-Z字形扫描 #include<iostream> #include<cmath> using namespace std; #define N 500 int ma ...

  6. Python文件基本操作及上下文管理

    文件基本操作 打开文件:f = open(fole_name,mode = 'r'),传入表示文件路径的字符串,会返回一个文件对象,mode是文件打开模式. 关闭文件:f.close(),调用给定文件 ...

  7. lnmp环境搭建:Centos7 + Nginx1.12.2 + Mysql-5.6.38 + PHP7.2.0

    https://blog.csdn.net/ty_hf/article/details/50622888

  8. Linux服务器性能查看命令

    一.uptime命令 [root@#test~]# uptime15:26:42 up 101 days, 18:44,  3 users,  load average: 0.18, 0.22, 0. ...

  9. django,模板继承常用标签和规则

    一.定义基础模板 在html内容中定义多个block块,block由子模板引用同名block块,来决定是否替换这些部分{% block title %}一些内容,这里可不填{% endblock %} ...

  10. The sequence and de novo assembly of the giant panda genome.ppt

    sequencing:使用二代测序原因:高通量,短序列 不用长序列原因: 1.算法错误率高 2.长序列测序将嵌合体基因错误积累.嵌合体基因:通过重组由来源与功能不同的基因序列剪接而形成的杂合基因 se ...