九度 题目1422:Closest Number

转载请注明本文连接http://blog.csdn.net/yangnanhai93/article/details/40536263

题目链接http://ac.jobdu.com/problem.php?pid=1422

这个题目一看,10s,刚上来我就用暴力的方式去求解,果然超时了,汗。。。

后来想想,暴力的方式上可以进行剪枝。

1:我不用计算左和右哪个最小,我直接按照距离来,直接计算就好了,但是需要优先比较左边的。

2:如果左边或右边不存在了,那就直接在另一边找就可以了。

3:需要先排除最小值的情况,这个会方便后面的代码,如果不进行最小值判断,在计算左右满足数的时候还需要考虑输出0的情况,比较麻烦

总是剪枝之后比他们动态规划的结果还要好啦

#include <stdio.h>
using namespace std;
int main()
{
    //freopen("data.in","r",stdin);
    int A[1000000],n,num,minNum;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&num);
        minNum=2147483647;
        for(int i=0;i<num;i++)
        {
            scanf("%d",&A[i]);
            if(A[i]<minNum)
                minNum=A[i];
        }
        int i=0;
        while(i<num&&A[i]>=A[0])
            i++;
        if(i<num)
            printf("%d",A[i]);
        else
            printf("%d",0);
        for (int i=1;i<num;i++)
        {
            if(A[i]==minNum)
            {
                printf(" %d",0);
                continue;
            }
            int jl=i,jr=i;
            bool isTrue=false;
            while(jl>=0&&jr<num)
            {
                if(A[jl]<A[i])
                {
                    printf(" %d",A[jl]);
                    isTrue=true;
                    break;
                }
                if(A[jr]<A[i])
                {
                    printf(" %d",A[jr]);
                    isTrue=true;
                    break;
                }
                jl--;
                jr++;
            }
            if(!isTrue)
            {
                while(jl>=0)
                {
                    if(A[jl]<A[i])
                    {
                        printf(" %d",A[jl]);
                        isTrue=true;
                        break;
                    }
                    jl--;
                }
                while(jr<num)
                {
                    if(A[jr]<A[i])
                    {
                        printf(" %d",A[jr]);
                        isTrue=true;
                        break;
                    }
                    jr++;
                }
            }
        }
        printf("\n");
    }
    return 0;
}
/**************************************************************
    Problem: 1422
    User: vincent_ynh
    Language: C++
    Result: Accepted
    Time:1110 ms
    Memory:4852 kb
****************************************************************/

欢迎喜欢算法的人一起交流 [email protected]

时间: 2024-08-10 17:29:53

九度 题目1422:Closest Number的相关文章

九度 题目1335:闯迷宫 题目1365:贝多芬第九交响曲

转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/40718149 简单说说宽度优先搜索BFS 说实话,这是第一个自己写的宽度优先搜索的题目,之前也是不太明白之间的区别,好吧,只能说自己学的太渣-- 言归正传,对于初学者来说,可能最大的概念就是一个是深度搜索,一个是宽度搜索,好吧,我表示废话了,我其实就是这个样子的,然后一直不得甚解...所以第一次上来,我就直接搜索DFS,结果太明显,就是TLE或者MLE,然后就抓狂中,这可能是

九度 题目1154:Jungle Roads

题目描述: The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to

九度 题目1144:Freckles

题目描写叙述: In an episode of the Dick Van Dyke show, little Richie connects the freckles on his Dad's back to form a picture of the Liberty Bell. Alas, one of the freckles turns out to be a scar, so his Ripley's engagement falls through. Consider Dick's

九度-题目1214:丑数

http://ac.jobdu.com/problem.php?pid=1214 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输入包括一个整数N(1<=N<=1500). 输出: 可能有多组测试数据,对于每组数据,输出第N个丑数. 样例输入: 3 样例输出: 3 一开始的想法是递增遍历足够多的数字,得到长度为1500的数组.数组中每个元素对应

九度 题目1453:Greedy Tino

题目描述: Tino wrote a long long story. BUT! in Chinese... So I have to tell you the problem directly and discard his long long story. That is tino want to carry some oranges with "Carrying pole", and he must make two side of the Carrying pole are t

九度OJ 1040 Prime Number (筛素数,试除法)

题目描述: Output the k-th prime number. 输入: k≤10000 输出: The k-th prime number. 样例输入: 3 7 样例输出: 5 17 这道题,好久以前使用试除法做的,原理是维护一个素数表,根据输入的num,确定是否之前算过,算过了,就直接输出,没算过,就现在开始算,并且把中间的素数全保存下来: #include<stdio.h> int k[10001]; int main(int argc, char *argv[]) { k[1]=

九度 题目1123:采药

题目描述: 辰辰是个很有潜能.天资聪颖的孩子,他的梦想是称为世界上最伟大的医师. 为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题. 医师把他带到个到处都是草药的山洞里对他说: "孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值. 我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大." 如果你是辰辰,你能完成这个任务吗? 输入: 输入的第一行有两个整数T(1 <=

九度 题目1122:吃糖果

题目描述: 名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0). 妈妈告诉名名每天可以吃一块或者两块巧克力. 假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案. 例如: 如果N=1,则名名第1天就吃掉它,共有1种方案: 如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案: 如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案: 如果N=4,则名名可以

九度 题目1205:N阶楼梯上楼问题

题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括一个整数N,(1<=N<90). 输出: 可能有多组测试数据,对于每组数据, 输出当楼梯阶数是N时的上楼方式个数. 样例输入: 4 样例输出: 5 分析:第n阶台阶的方法等于上到第n-1阶台阶的方法加上第n-2阶的台阶的方法之和,因为89阶的时候已经超过2的32次方,所以用long long int 代码如下: #include <stdio.h> long long int