試將 1 到 n 這 n 個正整數分成三份,使得這三份的和相等。
輸入乙個正整數 n (1≤n≤2⋅105)。
輸出 n 個正整數 k1,k2,…,kn (1≤ki≤3),用空格隔開。ki 表示要把 i 這個整數分在第幾組。
如果有多解輸出任意一解。如果無解輸出impossible
。
input
6output
3 2 1 1 2 3input
5output
1 2 2 1 3input
7output
impossible題目大概:
1到n這n個整數,問能否分成相等三部分,如果能,那麼就輸出它輸入那個集合。
思路:構造題,可以看出六個連續的數可以構成一組,能組成相等的三個整數。
然後手動構造出小樣例,大樣例都是小樣例加多個6.
**:
#include using namespace std;
#define ll long long
const int maxn=2e5+100;
int vis[maxn];
int main()
int st;
if((n-5)%6==0)
}if((n-6)%6==0)
}if((n-8)%6==0)
}if((n-9)%6==0)
}for(int i=1; i<=n; i++)
return 0;
}
整數劃分(劃分dp)總結
寫了幾個題發現整數劃分是一類題,而不是一道題。具體題型 1 n相同元素放入m個相同的盤子 盤子允許為空 例題 放蘋果 poj 1664設dp i j 為 j 個元素放入i個盤子轉移方程 dp i j dp i 1 j 新新增乙個盤子,盤子為空 dp i j dp i j i i個盤子 各取出乙個 2...
整數劃分問題
整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為 1 我們該如何找出所有的劃分呢?我們可以先來看看整數劃分的規律 譬如正整數 6 劃分情況如下 6 5 14 2 4 1 1 3 3 3 2...
整數劃分問題
給定乙個自然數,分成k部分,a1,a2.的數的和,要求a1 a2.求有多少種?原理 整數n拆分成最多不超過m個數的和的拆分數,和n 拆分成最大不超過m的拆分數相等。根據這個原理,原問題就轉化成了求最大拆分為k的拆分個數與最大拆分為k 1的拆分個數的差 f n,k f n,k 1 f n k,k 如下...