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;
}
上一篇:洛谷P7577 简单模拟题


下一篇:Add One