• 关于输入一组数据求最小的问题


    问题链接:

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1350

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1408

    两个问题,自己第一个代码是没有敲出来的,第二个代码虽然是搞定了,

    但是在处理是分析不清楚,使用了两个for循环,导致时间上相对于别人的代码有很大的差距。

    自己AC的1408:

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
        int t;
        cin>>t;
        while(t--){
            //在这里首先声明我是仅仅考虑了一般的情况,特殊情况待会在统一的考虑
        int N,D,count = 1,index = 0;
        cin>>N>>D;
        int *a = new int [N];//每棵树苗都对应着一个点,将点的坐标保存在这里
        for(int i = 0;i < N;i++)cin>>a[i];
        sort(a,a+N);
        //下面的计算就是要将树苗的坐标记录下来,然后有一个count计数器进行计数
    
        for(int i = 0;i < N;i = index){
            int b = a[index] + D;
        for(int j = index;j < N;j++){
                if(j<N&&a[j]>=b){
                    count++;
                    index = j;
                    break;
                    }
                else index++;
        }
        }
    
        cout<<count<<endl;
        delete [] a;
        }
        return 0;
    }
    View Code

    淦珺在部分细节方面处理的比我好多了,在一for循环中是通过一个变量代表了一个数组,相对来说处理的方式就比我的优化

    #include <iostream>
    #include <cstdio>
    using namespace std;
    #define N 100010
    int d[N];
    int main()
    {
        int T,n,D,cnt,m;
        scanf("%d",&T);
        while(T--){
            cnt=1;
            scanf("%d%d",&n,&D);
            scanf("%d",&d[0]);
            m=d[0];
            for(int i=1;i<n;i++){
                scanf("%d",&d[i]);
                if(d[i]-m>=D) cnt++,m=d[i];
            }
            printf("%d
    ",cnt);
        }
        return 0;
    }
    View Code

    第1305题AC代码:

    #include<iostream>
    #include<cstdio>
    #define M 100100
    using namespace std;
    
    int num[M],Max[M],Min[M];
    //这个Max我不打算要了
    
    int max(int a,int b)
    {
        return a>b?a:b;
    }
    int main()
    {
        int T,n,D;
        long long ans;
        cin>>T;
        while(T--){
            ans=0;
            cin>>n>>D;
            for(int i=0;i<n;i++) cin>>num[i];
    //原来开始所有的结果都是保存在num这个数组当中
    
            Max[0]=num[0];
    //第一个
            for(int i=1;i<n;i++)
            {
                if(Max[i-1]-num[i]>D)
    //当结果是大于的时候,是不符合题目的要求的。
    //直接让最大值返回,到Max数组,然后后面的数量关系会自动的调整好的
                    Max[i]=Max[i-1]-D;
                else Max[i]=num[i];
            }
    //处理一次最大值,还要处理一次最小值,虽然还没有理解原因。
            Min[n-1]=num[n-1];
            for(int i=n-2;i>=0;i--)
            {
                if(Min[i+1]-num[i]>D)
                    Min[i]=Min[i+1]-D;
                else Min[i]=num[i];
            }
    
            for(int i=0;i<n;i++)
    ans+=(max(Min[i],Max[i])-num[i]);
    //ans+=Min[i]-num[i];
    //没看懂,取两个的最大值,然后和num[i]作差。
    //然后不断的将结果返回到ans。什么情况?
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code
    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    打造绿色JRE
    AOSP(Android Open Source Project) Android开源项目
    SyncML协议简述
    诺基亚 索爱 低端手机及智能手机 与 QQ邮箱或MyTT 通讯录同步 介绍
    Android 的源代码结构
    recovery v1跟recovery v2的区别
    Android系统架构
    haoGOD6.6 修改自XDA的thedroidsector的kingkernel #8 04/22
    下一代Android或官方支持“App2sd”
    Android 中的微型云
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/3875571.html
Copyright © 2020-2023  润新知