牛客网 1222 01

来源:互联网 发布:ubuntu命令行升级系统 编辑:程序博客网 时间:2024/06/06 10:58

https://www.nowcoder.com/acm/contest/37/A


一般枚举会超时!

这是我写的

1 4 9 16 25 36 49

值恰好是边界是 直接开方相减 如果不睡 因为开方直接向下取整 所以start++ 在相减

#include<stdio.>#include<math.h>int main(){    int a,b,t;    double zhena;    int sum;    int jiaa,start,end;    int c;    scanf("%d",&c);    while(c--){scanf("%d%d",&a,&b);if(a>b){t=a;a=b;b=t;}sum=0;zhena=sqrt(a);start=jiaa=sqrt(a);        end=sqrt(b);if(zhena!=jiaa){start++;}sum=end-start;printf("%d\n",sum+1);    }return 0;}
下面是q神的代码 

#include<bits/stdc++.h>using namespace std;vector<int> res;int main(){    for(int i=0;i*i<=1000000000;i++)        res.push_back(i*i);    int T;    scanf("%d",&T);    while(T--)    {        int l,r;        scanf("%d%d",&l,&r);        int ans=upper_bound(res.begin(),res.end(),r)-lower_bound(res.begin(),res.end(),l);        printf("%d\n",ans);    }    return 0;}


关于

lower_bound(r[x].begin(),r[x].end(),l)upper_bound(r[x].begin(),r[x].end(),R)
lower_bound与upper_bound的返回值是不同的lower_bound返回第一个大于等于x的数的地址例如数组 1 1 1 3 5而需要找的那个数是2,怎么返回呢,就是返回那个第一个大于 2 的数的地址,就是返回3的位置,那么再有一组数据就是5个数1 1 1 3 5,还是需要找寻2,那么该返回什么呢?就是第一个3的地址.upper_bound返回第一个大于x的数的地址也就是说如果在5个数 1 , 1, 2 , 2 , 4 ,里边寻找3,那么就会返回4的地址


http://www.cnblogs.com/bbqub/p/7774756.html惊讶

原创粉丝点击