描述

对于一个素数P,我们可以用一系列有理分数(分子、分母都是不大于N的自然数)来逼近sqrt(p),例如P=2,N=5的时候:1/1<5/4<4/3<sqrt(2)<3/2<5/3<2/1。
任 务 :
给定P、N(N>sqrt(p)),求X、Y、U、V,使x/y<sqrt(p)<u/v且x/y与sqrt(p)之间、sqrt(p)与u/v之间都不能再插入满足题意的有理分数。

输入格式

输入文件的第一行为P、N,其中 P、N<30000。

输出格式

输出文件只有一行,格式为“X/Y U/V”。注意,答案必须是既约的,也就是说分子、分母的最大公约数必须等于1。

测试样例1

输入

样例1: 
2 5 
样例2: 
5 100

输出

样例1: 
4/3 3/2

样例2: 
38/17 85/38

代码

 #include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
int des_int,P,N,a,b,ans[]={,,,,,,,,,};
double des; int check(int i,int j,double x){
return (fabs( des-double(ans[i])/double(ans[j]) ) > fabs( des-x ));
} void xiao(){//ans1~2
for(int i=des_int-;i<=N;i++){
int flag=;
for(int j=;j<=i;j++){
double x=double(i)/double(j);
if(x>des) continue;
if(check(,,x)){
double k1=(double(ans[])/double(ans[])),k2=x;
bool fl=(k1==k2);
if(fl) continue;
ans[]=i;ans[]=j;
}
else{
flag=;break;
}
}
if(flag==) continue;
}
} void da(){//ans3~4
for(int i=des_int+;i<=N;i++){
int flag=;
for(int j=i-;j>=;j--){
double x=double(i)/double(j);
if(x<des) continue;
if(check(,,x)){
if(fabs( des-double(ans[])/double(ans[]) )== fabs( des-x )) continue;
ans[]=i;ans[]=j;
}
else{
flag=;break;
}
}
if(flag==) continue;
}
}
int main(){
// freopen("01.txt","r",stdin);
scanf("%d %d",&P,&N);
des=sqrt(double(P));
des_int=des;
xiao();
da(); printf("%d/%d %d/%d\n",ans[],ans[],ans[],ans[]);
return ;
}

穷尽今生所学,T掉2个点

上看不懂的别人代码:

 #include <math.h>
#include <stdio.h>
#include <stdlib.h> int main(int argc, char **argv)
{
int i, j;
int p, n;
int a, b, c, d;
int beg, end;
double s, max = , min = , t;
scanf("%d%d", &p, &n);
s = sqrt(p);
for(i = ; i <= n; i++){
beg = i * s - ;
end = beg + ;
if(beg <= ){
beg = ;
}
if(end > n){
end = n;
}
for(j = beg; j <= end; j++){
t = (double)(j) / i;
if(t < s && t > max){
a = j, b = i;
max = t;
}
}
}
for(i = ; i <= n; i++){
beg = i * s;
end = beg + ;
if(beg <= ){
beg = ;
}
if(end > n){
end = n;
}
for(j = beg; j <= end; j++){
t = (double)(j) / i;
if(t > s && min > t){
c = j, d = i;
min = t;
}
}
}
printf("%d/%d %d/%d\n", a, b, c, d);
return ;
}

---------------我是猥琐的分割线---------------

 #include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
int des_int,P,N,a,b,ans[]={,,,,,,,,,};
double des; int check(int i,int j,double x){
return (fabs( des-double(ans[i])/double(ans[j]) ) > fabs( des-x ));
} void xiao(){//ans1~2
for(int i=des_int-;i<=N;i++){
int flag=;
for(int j=;j<=i;j++){
double x=double(i)/double(j);
if(x>des) continue;
if(check(,,x)){
double k1=(double(ans[])/double(ans[])),k2=x;
bool fl=(k1==k2);
if(fl) continue;
ans[]=i;ans[]=j;
}
else{
flag=;break;
}
}
if(flag==) continue;
}
} void da(){//ans3~4
for(int i=des_int+;i<=N;i++){
int flag=;
for(int j=des_int/i+;j>=;j--){
double x=double(i)/double(j);
if(x<des) continue;
if(check(,,x)){
if(fabs( des-double(ans[])/double(ans[]) )== fabs( des-x )) continue;
ans[]=i;ans[]=j;
}
else{
flag=;break;
}
}
if(flag==) continue;
}
}
int main(){
// freopen("01.txt","r",stdin);
scanf("%d %d",&P,&N);
des=sqrt(double(P));
des_int=des;
xiao();
da(); printf("%d/%d %d/%d\n",ans[],ans[],ans[],ans[]);
return ;
}

39行调了个阈值成功骗分,主要都是da()函数耗的时间,也就没多想,+500有点危险,+100绝对过不了

想法来源于(能跑这么久的数肯定很大,分母也就没必要那么大了!!!)

TYVJ P1077 有理逼近 Label:坑,tle的好帮手 不懂的更多相关文章

  1. TYVJ P1037 阶乘统计2 Label:坑

    描述 n的阶乘定义为n!=1*2*3*……*n 如3!=6 n!通常最后会有很多0,如5!=120 最后有一个0,现在统计n!去除末尾的0后,最后k位是多少  输入格式  第一行包括两个数n,k  输 ...

  2. TYVJ P1032 零用钱 Label:贪心

    背景 USACO OCT09 7TH 描述 作為创造產奶纪录的回报,Farmer John决定开始每个星期给Bessie一点零花钱. FJ有一些硬币,一共有N (1 <= N <= 20) ...

  3. 1833 深坑 TLE 求解

    题目描述: 大家知道,给出正整数n,则1到n这n个数可以构成n!种排列,把这些排列按照从小到大的顺序(字典顺序)列出,如n=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 ...

  4. TYVJ P1004 滑雪 Label:记忆化搜索

    背景 成成第一次模拟赛 第三道 描述     trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形.为了得到更快的速度,滑行的路线必须向下倾斜.    ...

  5. TYVJ P1068 STR Label:KMP匹配 不懂

    描述 给你两个串A,B,可以得到从A的任意位开始的子串和B匹配的长度.给定K个询问,对于每个询问给定一个x,求出匹配长度恰为x的位置有多少个.N,M,K<=200000 输入格式 第一行三个数  ...

  6. TYVJ P1070 罗马数字 Label:一定要看的枚举

    描述 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,以下是标准数字表: I 1  L 50  M 1000V 5  C 100X 10 D 500最多3个同样的可以表示为10 ...

  7. TYVJ P1090 母舰 Label:模拟,题目看清就好

    背景 广东汕头聿怀初中 Train#3 Problem 1 描述 在小A的星际大战游戏中,一艘强力的母舰往往决定了一场战争的胜负.一艘母舰的攻击力是普通的MA(Mobile Armor)无法比较的.对 ...

  8. TYVJ P1072 bomb Label:看不懂题意

    描述 一场战争正在A国与B国之间如火如荼的展开.B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指挥部,从而取得战斗的胜利!当然,A国人民不会允许这样的 ...

  9. TYVJ P1016 装箱问题 Label:01背包 DP

    做题记录:2016-08-15 23:07:04 背景 太原成成中学第2次模拟赛 第三道 描述 有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 ( ...

随机推荐

  1. 修改setup.py的源

    方法一: 修改文件 ~/.pydistutils.cfg为: [easy_install] index_url = http://pypi.douban.com/simple 方法二: 直接在setu ...

  2. jQuery属性,方法操作

     addClass() 向匹配的元素添加指定的类名.attr() 设置或返回匹配元素的属性和值.hasClass() 检查匹配的元素是否拥有指定的类.html() 设置或返回匹配的元素集合中的 HTM ...

  3. 66. 有序数组构造二叉搜索树[array to binary search tree]

    [本文链接] http://www.cnblogs.com/hellogiser/p/array-to-binary-search-tree.html [题目] 编写一个程序,把一个有序整数数组放到二 ...

  4. Solr5.3.1通过copyField设置多个field(字段)同时检索

    如果业务需要我们对多个field同时进行检索,有没有什么好的办法呢?非常幸运的是Solr为我们提供了copyField对多个field进行索引和检索.然而配置也非常简单. 修改schame.xml,添 ...

  5. 2.saltstack笔记之目标,模块,返回写入数据库

    作者:刘耀 QQ:22102107 一.目标(targeting Minions) 1.匹配Minions Id 匹配所有 (*) [root@node1 salt]# salt '*' test.p ...

  6. 如何从sun公司官网下载java API文档(转载)

    相信很多同人和我一样,想去官网下载一份纯英文的java API文档,可使sun公司的网站让我实在很头疼,很乱,全是英文!所以就在网上下载了别人提供的下载!可是还是不甘心!其实多去看看这些英文的技术网站 ...

  7. Road Construction(poj 3352)

    题意:求最少天几条边,使这个无向图变成双连通图. /* tarjan缩点后,形成一棵树,求出叶子节点数tot,答案是(tot+1)/2 */ #include<cstdio> #inclu ...

  8. mysql 建表语句

    修改id为自动增长: alter table book b_ISBN int(11) auto_increment;   自动增长要加的:auto_increment 基本的sql语句: 选择:sel ...

  9. hdu 2050:折线分割平面(水题,递归)

    折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  10. hdu 2041:超级楼梯(水题,递归)

    超级楼梯 Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Su ...