zoukankan      html  css  js  c++  java
  • c_pat_整数集合划分 & 结绳(贪心地分)

    1113.整数集合划分

    给定一个包含 N 个正整数的集合,请你将它们划分为两个不相交的集合 A1 和 A2,其中 A1 包含 n1 个元素,A2 包含 n2 个元素。
    用 S1 表示集合 A1 内所有元素之和,S2 表示集合 A2 内所有元素之和。
    请你妥善划分,使得 |n1−n2| 尽可能小,并在此基础上 |S1−S2| 尽可能大。

    |n1−n2| 肯定只能等于 0/1(奇数/偶数)

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        int n; cin>>n;
        int A[n],s[n+1]; for (int i=0; i<n; i++) cin>>A[i];
        sort(A, A+n);
        memset(s,0,sizeof s);
        for (int i=0; i<n; i++) s[i+1]=s[i]+A[i];
        
        int m=n/2;
        if (n%2==1) {
            cout<<1<<' '<<(s[n]-s[m])-s[m];
        } else {
            cout<<0<<' '<<(s[n]-s[m])-s[m];
        }
        return 0;
    }
    

    1125.结绳

    每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。
    这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。
    每次串连后,原来两段绳子的长度就会减半。

    思路
    感觉像个脑筋急转弯,承诺管全局上看,每次将两根未曾使用过,且最短的绳子进行操作,因为越早操作的绳子的被折叠次数越多,所以尽量将长度较长的绳子后操作;

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        int n,x; cin>>n;
        priority_queue<int, vector<int>, greater<int>> q;
        for (int i=0; i<n; i++) cin>>x,q.push(x);
        
        while (q.size()>1) {
            int a=q.top(); q.pop();
            int b=q.top(); q.pop();
            q.push(a+b>>1);
        }
        cout<<q.top();
        return 0;
    }
    
  • 相关阅读:
    科学-化学:化学百科
    科学-物理:物理学 (自然科学学科)百科
    科学-建筑学-建筑美学:建筑美学百科
    科学-建筑学:建筑学百科
    科学-哲学-美学:美学(中国哲学二级学科)
    哲学:哲学(世界观学说、社会形态之一)
    科学-语文:语文(语言和文学的简称)
    科学-分析:分析
    建模:数学建模
    科学-数学:数学
  • 原文地址:https://www.cnblogs.com/wdt1/p/13697247.html
Copyright © 2011-2022 走看看