# Greedy# Pattern Recognition# Map

c134 - 00668 - Parliament

🔗 前往 ZeroJudge 原題

題目描述

題目要求找出對於給定的議員數量 N,將議員分成不同人數的委員會,使得委員會的數量最大,且每天協調會的組成都不同。委員會人數必須互不相同。

解題思路

題目觀察發現,對於給定的 N,委員會的人數分配存在一個規律。程式碼中預先計算了從 1 到 1000 的 N 对应的最佳委員會分配方案,並將其儲存在 map 中。對於輸入的 N,直接從 map 中取出對應的委員會分配方案並輸出。這個規律是從 2, 3 開始,每次增加委員會數量,並保持委員會人數互不相同。

複雜度分析

  • 時間複雜度: O(1)
  • 空間複雜度: O(1)

程式碼

#include <iostream>
#include <vector>
#include <map>
using namespace std;
int n,p=5,k=4,t,st;
vector <int> a={0,9999};
map <int,vector <int>> mp;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	for(int i=1;i<=1000;++i){
		if(i<=4){
			++a[0];
		}
		else if(i==p){
			a.clear();
			for(int j=2;j<k;++j){
				a.push_back(j);
			}
			a.push_back(9999);
			p+=k;
			++k;
		}
		else{
			for(int j=0;j<a.size();++j){
				if(a[j]+1!=a[j+1]){
					++a[j];
					break;
				}
			}
		}
		mp[i]=a;
	}
	cin >> t;
	while(t--){
		if(st)cout << "\n";
		st=1;
		cin >> n;
		for(int i=0;i<mp[n].size()-1;++i){
			if(i)cout << " ";
			cout << mp[n][i];
		}
		cout << "\n";
	}
}

Discussion