记录一下自己的笔试的代码题


第一题

给出n个点,寻找两个点之间的最短距离是多少,并保留4位小数。


    //两点间距离
    int point(){
        int n;
        cin>>n;
        if(n == 1){
            cout<<fixed<<setprecision(4)<<0.0;
            return 0;
        }
        vector<int> x(n), y(n);
        for(int i = 0; i < n; ++i){
            cin>>x[i];
        }
        for(int i = 0; i < n; ++i){
            cin>>y[i];
        }
        double mindist = (double)INT32_MAX;
        for(int i = 0; i < n; ++i){
            for(int j = i+1; j < n; ++j){
                double dist = sqrt((double)((y[i] - y[j]) * (y[i] - y[j]) + (x[i]-x[j]) * (x[i]-x[j])));
                if(mindist - dist > 0.000001) mindist = dist;
            }
        }
        cout<<fixed<<setprecision(4)<<mindist;
        return 0;
    }

暴力解法,时间复杂度n*(n-1)/2,O(n²),全通过。

第二题

给出N段绳子,切成K段能切出最长是多少。


    //切绳子K段
    int cut(){
        int N, K;
        cin>>N>>K;
        vector<int> v(N);
        int sum = 0;
        for(int i = 0; i < N; ++i){
            double t;
            cin>>t;
            v[i] = (int)(t * 100);
            sum += v[i];
        }
        if(N == 1){
            cout<<fixed<<setprecision(2)<<(double)v[0]/ (double)K / 100.0;
            return 0;
        }
        int l = sum / K;
        int cnt = 0;
        while(cnt < K){
            cnt = 0;
            for(int n : v){
                cnt += n / l;
            }
            if(cnt >= K) break;
            else l -= K-cnt;
        }
        cout<<fixed<<setprecision(2)<<(double)l/100.0;
        return 0;
    }

为了减少浮点运算,先将有两位小数的绳子长度乘100。首先求出总和能切出的最大绳子长度,再统计每条绳子能切出这个长度多少条。每次使长度减少两者差值,直到切出来的长度大于或等于K为止。全通过。