zoukankan      html  css  js  c++  java
  • 折腾笔记-计蒜客t1156AC记

    欢迎查看原题地址

    此题思路(最初版):

    暴力,得出最相近的,1000ms呢,除非数据超大,否则不超时。

    说明: 爆搜,搜出结果,时间复杂度基本 $O(n^2)$

    注:本文所有时间(与空间)复杂度仅为估计,不排除坑爹数据卡大复杂度的可能

    #include <bits/stdc++.h>
    using namespace std;
    bool kkk(int a,int k) {
        int tmp = abs(a);
        //cout<<"data:"<<tmp<<"k:"<<k<<endl;
        if(tmp<k) {
            return 1;
        } else {
            return 0;
        }
    }
    int main() {
        long long n,m;
        long long a[100001],b[10001];
        cin>>n;
        for(int i = 0;i<n;++i) {
            cin>>a[i];
        }
        cin>>m;
        for(int i = 0;i<m;++i) {
            int k;
            cin>>k;
            int mink = 2345678;
            int minv = 2345678;
            for(int j = 0;j<max(n,m);++j) {
                if(k-a[j]==0) {
                    minv = a[j];
                    break;
                }
                if(kkk(k-a[j],mink)) {
                    mink = k-a[j];
                    minv = a[j];
                }
            }
            cout<<minv<<endl;
        }
        return 0;
    }

    详细提交代码:点击查看

    详细提交结果:

    测试数据共20组:

    $color{green}{AC}$ 6组

    $color{navy}{TLE}$ 14组

    $color{red} ext{总得分:30}$

    于是,我开始探究为什么没过。。。


    经研究表明:有一部分数据很大,一般的暴力水过是困难(难上加难)了,与其纠结所谓“怎么水过多骗骗分”还不如花一点时间想想正解,终于,功夫不负有心人,我找到了upper_bound()

    先看看他的用法:

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        int a[10] = {1,2,3,4,5,6,11,12,13,14};
        int b,c;
        b = upper_bound(a,a+10,7)-a;
        cout<<a[b]<<endl;
        return 0; 
    }

    这是实例,暂时不提供运行结果。

    那么我们不难想到使用upper_bound()查找不小于这个数的最大数那么。。。

    有两种情况:

    设不小于这个数的最大数 = a;

    一种:a==n

    二种:a< n

    那么就出来了这段代码:

    #include <bits/stdc++.h>
    using namespace std;
    int kkk(int a,int b,int k) {
        int tmp1 = abs(k-a);
        int tmp2 = abs(k-b);
        if(tmp1==0) {
            return a;
        }
        if(tmp2==0) {
            return b;
        }
        if(tmp2>tmp1){
            return a;
        } else {
            return b;
        }
    }
    int main() {
        long long n,m;
        long long a[100001];
        cin>>n;
        for(int i = 0;i<n;++i) {
            cin>>a[i];
        }
        sort(a,a+n);
        cin>>m;
        for(int i = 0;i<m;++i) {
            int m;
            cin>>m;
            int j = upper_bound(a,a+n,m)-a;
            int k = j-1;
            //cout<<a[j]<<" "<<a[k]<<" "<<m<<endl;
            cout<<kkk(a[j],a[k],m)<<endl;
        }
        return 0;
    }

    详细提交代码:点击查看

    详细提交结果:

    测试数据共20组:

    $color{green}{AC}$ 20组

    $color{green} ext{总得分:100}$

  • 相关阅读:
    122. 买卖股票的最佳时机 II-leetcode
    SQL优化
    《C++ Primer Plus》读书笔记之十二—C++中的代码重用
    《C++ Primer Plus》读书笔记之十一—类继承
    《C++ Primer Plus》读书笔记之十—类和动态内存分配
    《C++ Primer Plus》读书笔记之九—使用类
    《C++ Primer Plus》读书笔记之八—对象和类
    一道算法题-换钱
    《C++ Primer Plus》读书笔记之七—内存模型和名称空间
    《C++ Primer Plus》读书笔记之六—函数探幽
  • 原文地址:https://www.cnblogs.com/littlefrog/p/11939511.html
Copyright © 2011-2022 走看看