[コードテストC+]秤


今日の質問


https://www.acmicpc.net/problem/2437

秤。



方法

  • は、まず昇順に並べられます.
  • は、まず1から開始し、そうでなければ1を返します.
  • から増加し始めた.ここで重要なのは、次に加算する数字が、これまで加算された数字+1以下でなければならないことです.
  • どうしたの?左側には1から合計までのすべての数が生成されます.したがって、新しい数字を追加すると、1から
  • を減算することができる.
  • 加算数+1より大きいと、最小の1を除いても次の数は生成されない.
  • 私の答え

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n;
    const int MAX = 1000;
    int weight[MAX];
    
    // 저울
    long long solution(){
        sort(weight, weight+n);
        if(weight[0] != 1)
            return 1;
        long long sum = 1;
        for(int i=1;i<n;i++){
            if(weight[i] > sum + 1)
                break;
            sum += weight[i];
        }
        
        return sum+1;
    }

    別の解釈

    #include <stdio.h>
    
    void selectionSort(int array[], int inputNum) {
    	for (int i = 0; i < inputNum; i++) {
    		for (int j = i + 1; j < inputNum; j++) {
    			int tmp;
    			if (array[i] > array[j]) {
    				tmp = array[i];
    				array[i] = array[j];
    				array[j] = tmp;
    			}
    		}
    	}
    }
    int main(int argc, char* argv[]) {
    	int inputNum;
    	scanf("%d", &inputNum);
    
    	int weights[1000];
    	for (int i = 0; i < inputNum; i++)
    		scanf("%d", &weights[i]);
    	selectionSort(weights, inputNum);
    
    
    	int last = 0;
    	for (int i = 0; i < inputNum; i++) {
    		if (weights[i] > last + 1) {
    			break;
    		}
    		last += weights[i];
    	}
    	printf("%d", last + 1);
    	return 0;
    }

    学ぶべきところ

  • は正確に私の解と同じです.
  • の違いは、sort選択sortが使用されていることである.selection sortは、私が使用しているsort(quicksort)と同じか遅いかもしれません.n^2.quick sortは最悪のn^2平均値nlogn
  • である