P7902 「PMOI-0」儒略の日 題解
阿新 • • 發佈:2021-12-21
我踩過的坑
-
對於數字 \(i\),若 \(i\) 為奇數,則數字 \(i\) 兩次出現位置之差 必須 超過 \(d\)。
-
對於數字 \(i\),若 \(i\) 為偶數,則數字 \(i\) 兩次出現位置之差 不能 超過 \(d\)。
第一句的要求是:兩個出現位置之差要 \(> d\)。
而第二句的要求是:兩個出現位置之差 \(\le d\)。
思路
-
判斷有無解:把整個串過一遍,遇到單數 \(+1\),雙數 \(+2\), 如果 $d \le $ 這個結果,那就無解,否則有解
-
有解:前面和後部放單數,中部放成對的雙數,如:
1 3 2 2 1 3
。
程式碼
#include<bits/stdc++.h> using namespace std; int n,d; int f(){ int size=0; for(int i=1;i<=n;i++) if(i%2==1) size++; else size+=2; return size; }//用來遍歷串的函式,用於判斷是否有解。 int main(){ cin>>n>>d; if(d>=f()){ cout<<-1;return 0; }//判斷是否有解,若沒有則直接輸出 -1 並退出。 for(int i=1;i<=n;i+=2) cout<<i<<" ";//先輸出單數。 for(int i=2;i<=n;i+=2) cout<<i<<" "<<i<<" ";//再輸出雙數,成雙成對。 for(int i=1;i<=n;i+=2) cout<<i<<" ";//最後再輸出單數。 return 0; }
作者: lzx1609