3641. 整數劃分(構造)
阿新 • • 發佈:2018-12-12
試將 1 到 n 這 n 個正整數分成三份,使得這三份的和相等。
Input
輸入一個正整數 n (1≤n≤2⋅105)。
Output
輸出 n 個正整數 k1,k2,…,kn (1≤ki≤3),用空格隔開。ki 表示要把 i 這個整數分在第幾組。
如果有多解輸出任意一解。如果無解輸出 Impossible
。
Examples
input
6
output
3 2 1 1 2 3
input
5
output
1 2 2 1 3
input
7
output
Impossible
題目大概:
1到n這n個整數,問能否分成相等三部分,如果能,那麼就輸出它輸入那個集合。
思路:
構造題,可以看出六個連續的數可以構成一組,能組成相等的三個整數。
然後手動構造出小樣例,大樣例都是小樣例加多個6.
程式碼:
#include <bits/stdc++.h> using namespace std; #define ll long long const int maxn=2e5+100; int vis[maxn]; int main() { int n; scanf("%d",&n); if(n==2||n==3||n%3==1) { printf("Impossible\n"); return 0; } int st; if((n-5)%6==0) { vis[1]=vis[4]=1; vis[2]=vis[3]=2; vis[5]=3; st=6; for(int i=st; i<=n; i=i+6) { vis[i]=1; vis[i+1]=2; vis[i+2]=3; vis[i+3]=3; vis[i+4]=2; vis[i+5]=1; } } if((n-6)%6==0) { vis[1]=vis[6]=1; vis[2]=vis[5]=2; vis[3]=vis[4]=3; st=7; for(int i=st; i<=n; i=i+6) { vis[i]=1; vis[i+1]=2; vis[i+2]=3; vis[i+3]=3; vis[i+4]=2; vis[i+5]=1; } } if((n-8)%6==0) { vis[1]=vis[2]=vis[3]=vis[6]=1; vis[4]=vis[8]=2; vis[5]=vis[7]=3; st=9; for(int i=st; i<=n; i=i+6) { vis[i]=1; vis[i+1]=2; vis[i+2]=3; vis[i+3]=3; vis[i+4]=2; vis[i+5]=1; } } if((n-9)%6==0) { vis[1]=vis[2]=vis[3]=vis[4]=vis[5]=1; vis[6]=vis[9]=2; vis[7]=vis[8]=3; st=10; for(int i=st; i<=n; i=i+6) { vis[i]=1; vis[i+1]=2; vis[i+2]=3; vis[i+3]=3; vis[i+4]=2; vis[i+5]=1; } } for(int i=1; i<=n; i++) { printf("%d ",vis[i]); } return 0; }