1. 程式人生 > 其它 >P7902 「PMOI-0」儒略の日 題解

P7902 「PMOI-0」儒略の日 題解

我踩過的坑

  1. 對於數字 \(i\),若 \(i\) 為奇數,則數字 \(i\) 兩次出現位置之差 必須 超過 \(d\)

  2. 對於數字 \(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