牛客算法周周练2

A. 相反数

签到题。

直接将原数分解后,重组即可。

#include<bits/stdc++.h>
using namespace std;
int n,b;
void solve(int x){
    while(x){
        b=b*10+x%10;
        x/=10;
    }
}
int main(){
    scanf("%d",&n);
    solve(n);
    printf("%d",b+n);
    return 0;
}

B. Music Problem

题目大意:

判断一个序列里是否有子序列的和能够被整除。

对于这种序列的题目, 八成都是可以做的。

表示是否拥有在模意义下和为的子序列。

表示讨论到当前情况是否拥有在模下和为的子序列。也可以理解成 的上一版本

所以就有

#include<bits/stdc++.h>
using namespace std;
const int MAX_N=1e5+5;
const int MAX_V=4000 + 5;
int t,n,a[MAX_N];
bool f[MAX_V],temp[MAX_V];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        memset(f,0,sizeof(f));
        memset(temp,0,sizeof(temp));
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            a[i]%=3600;
        }
        for(int i=1;i<=n;i++){
            if(f[0]) break;
            f[a[i]]=1;
            for(int j=1;j<3600;j++){
                if(temp[j]) f[(a[i]+j)%3600]=1;
                if(f[0]) break;
            }
            /*也可以写成
            for(int j=0;j<3600;j++) temp[j]=(f[j] || temp[j]) ? 1 : 0;
            或者
            for(int j=0;j<3600;j++) temp[j]=f[j]>temp[j]?f[j]:temp[j];
            */
            for(int j=0;j<3600;j++) temp[j]=f[j];
        }
        printf((f[0]?"YES\n":"NO\n"));
    }
    return 0;
}

C. 完全平方数

这道题根据题意,再观察一下样例,发现中最多有个完全平方数,但观察数据范围,可以为0,所以最多有个完全平方数,于是我们可以打一个暴力出来,时间复杂度

#include<bits/stdc++.h>
using namespace std;
int n;
long long l,r;
int main(){
    scanf("%d",&n);
    while(n--){
        int ans=0;
        scanf("%lld%lld",&l,&r);
        for(int i=(int)sqrt(l);i<=31622;i++){
            if(i*i>=l && i*i<=r) ans++;
            if(i*i>r) break;
        }
        printf("%d\n",ans);
    }
    return 0;
}

现在,就是想办法优化暴力,使其变成正解。

我们可以先预处理出中的所有的完全平方数个。

因为单调,所以可以二分查找出第一个大于等于 的完全平方数,二分查找出第一个大于的完全平方数,在将其下标相减,即可得到答案。

时间复杂度

#include<bits/stdc++.h>
using namespace std;
int n;
long long l,r,a[32005];
int main(){
    scanf("%d",&n);
    for(int i=0;i<=31622;i++) a[i]=i*i; 
    while(n--){
        scanf("%lld%lld",&l,&r);
        int L=lower_bound(a,a+31623,l)-a;
        int R=upper_bound(a,a+31623,r)-a;
        printf("%d\n",R-L);
    }
    return 0;
}
全部评论

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务