折腾笔记-计蒜客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}\text{总得分: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}\text{总得分:100}$

posted @ 2019-05-05 17:08  littlefrog  阅读(134)  评论(0编辑  收藏  举报