【ACM训练】2023 河南 CCPC省赛 vp

news2024/11/23 9:39:11

2023 河南 CCPC省赛

题目链接

VP赛况:
好菜

目录

  • 2023 河南 CCPC省赛
  • 赛况及总结
    • 赛况
    • 总结
  • 补题

赛况及总结

赛况

开场:我提前打印了题册,于是我们开始分开看题目,我先看了A,发现很签,遂上机,8 min 1A
接着跟榜看了F,发现枚举长度为k的子区间就行。又上机去写,交上去wa,发现区间min被我直接连续取min。Akimizussq提出单调队列滑动窗口即可。我赶忙上机修改,让他们去看榜上有人开的其他题。结果,我写臭了,被下标疯狂折磨,调试半天交上去还是wa。然后决定拿multiset搞,修改后,感觉没问题交上去还是wa。这时候就有些慌了。Akimizussqzky0902来机前,我给他们讲了思路,感觉没什么问题。。。看了一会发现我ans初值赋的0x3f3f3f3f,这题数据范围很大。所以改成ans=0x3f3f3f3f3f3f3f3f。1h27min 3A,这三发罚时都是我脑抽贡献的!

赛中:接着我们看榜,我去看B,Akimizussq去看了E,说是个DP。就开始双线程,B题我一开始觉得二分,只要区间最大值小于下一区间最小值即可。思考check函数怎么写的时候,Akimizussq说他会了E,遂上机写,可惜wa了。我上机去写B,码完一交喜提一wa。check函数写假了,改了两次,最后wa在第15个点。最后发现直接维护前缀最大值和后缀最小值即可,然后枚举就能写,赶紧上机码完,2h 8min 4A
接着开始接手Akimizussqzky0902在讨论的H题,这时候,我脑子不太清楚,绕在里面,好在Akimizussq很快将情况分类清楚了,我理解完就开始写,结果精度不够,wa了一发,改了一下3h 21min 3A
赛末:这段时间处理的不好,我们没有继续去看别的题,导致简单的C题都没有开,然后我和Akimizussq 决定开E,感觉就是摘花生多加一维而已,柿子当然就没什么问题,结果脑子抽了,空间爆了,就否定了这个想法(前天刚写过滚动数组优化),我的锅!最后我看到群友过了C,就跑去看了一下,大水题,随便写了一下,4h 6min 4A。只打了四个小时,最后就定格在5题870罚时。

总结

临近期末,这是本学期最后一次一起训练,由于环境限制,只能打4个小时,这套题目大部分题目还是不难的,5题罚时870,打的不是很好。我代码精准度不够,罚时较多。并且时间安排和机时安排还存在问题。下次应该一人开题的时候,其他队友继续看其他题目,大概获得方向即可。而不是两人死磕一道题(这样的方式只针对后面难题)
这样简单题可以很快解决完。接着就是继续提升实力!暑假将至,希望大家认真备考(yuxi)期末考试。继续加油!

补题

A 小水獭游河南 签到
题意:给你一个字符串让你判断能否将该字符串拆成两段非空字符串,前半段字符串每个字母只出现一次,后半段是一个回文串。

思路:从头开始遍历,每次判一下后面半部分是不是回文串即可。遇到出现过的字符就跳出循环即可。

参考代码:

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 1;

int st[26];
void Showball(){
  string s;
  cin>>s;
  int n=s.size();
  memset(st,0,sizeof st);
  int ok=0;
  for(int i=0;i<n;i++){
    int t=s[i]-'a';
    if(st[t]) break;
    st[t]=1;
    if(i+1<n){
    string a=s.substr(i+1);
    string b=a;
    reverse(all(a));
    if(a==b) {ok=1;break;}
    }
  }
  if(ok) cout<<"HE\n";
  else cout<<"NaN\n";
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

B. Art for Rest 思维
题意:给你一个数组a,对于一个正整数k( 1 ≤ k ≤ n 1\leq k \leq n 1kn),我们把数组a每k个分成一组,一共分 n / k n/k n/k组,如果我们把每组中的数排序,最后整个数组a都已排好序,那么就是满足条件的k。
让你找出所有满足条件的k有多少个?
思路:一个很显然的性质,我们要满足条件必须保证前一个区间的最大值不大于后一个区间的最小值即可。
但是由于我们需要枚举k,然后进行判断,如果进行滑动窗口就会超时。我们继续探究它的性质。我们发现,因为无论k为多大,我们最终要完成整个数组的排序,那么这个最大值和最小值的关系都是全段满足的。因此,我们可以预处理出前缀最大值,和后缀最小值即可。

参考代码:

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 2e6 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 0;

int n;
int a[N];
int pre[N];
int suf[N];
void Showball(){
    cin>>n;
    for(int i=1;i<=n;i++){
      cin>>a[i];
    }
    pre[0]=0,suf[n+1]=inf;
    for(int i=1;i<=n;i++) pre[i]=max(pre[i-1],a[i]);
    for(int i=n;i>=1;i--) suf[i]=min(suf[i+1],a[i]);
    
    int cnt=0;
    for(int i=1;i<=n;i++){
      int ok=1;
      for(int j=i+1;j<=n;j+=i){
        if(pre[j-1]>suf[j]){
         ok=0;break;
        }
      }

      if(ok) cnt++;
    }

    cout<<cnt<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

C Toxel 与随机数生成器 字符串
题意:给你两段生成随机数的代码,其中错误代码会出现周期性重复,给你一段随机数,让你判断是由哪段代码生成的。
思路:很简单,我们直接判断是否存在周期性重复。可以直接暴力判断,这里用kmp写一下。判断next数组最大值是否大于50即可。

参考代码:

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e6 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 0;

int ne[N];
void Showball(){
   string s;
   cin>>s;
   int n=s.size();
   s="?"+s;
   for(int i=2,j=0;i<=n;i++){
     while(j&&s[i]!=s[j+1]) j=ne[j];
     if(s[i]==s[j+1]) j++;
     ne[i]=j;
   }
   
   int ans=0;
   for(int i=1;i<=n;i++){
     ans=max(ans,ne[i]);
   }

   cout<<(ans>=50?"No\n":"Yes\n");
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

E. 矩阵游戏 线性DP
题意:给你一个矩阵,矩阵有三种值,‘0’,‘1’,‘?’,走到‘1’直接加一分。走到‘0’不加分,走到‘?’可以把‘?’变成‘1’,最多只能变x次。问你从左上角走到右下角最多能获得多少分?

思路:参考摘花生这道题目,可以发现这题就是线性DP,只是多了一维来表示修改次数即可。即 f i , j , k f_{i,j,k} fi,j,k表示所有到 ( i , j ) (i,j) (i,j)并且修改了 k k k次问号的走法获得的最大分数。因此,可以得到状态转移表达式:
f i , j , k = m a x ( f i − 1 , j , k , f i , j − 1 , k ) , f_{i,j,k}=max(f_{i-1,j,k},f_{i,j-1,k}), fi,j,k=max(fi1,j,k,fi,j1,k), s [ i ] [ j ] = ‘ 0 ’ s[i][j]=‘0’ s[i][j]=‘0’
f i , j , k = m a x ( f i − 1 , j , k , f i , j − 1 , k ) + 1 , f_{i,j,k}=max(f_{i-1,j,k},f_{i,j-1,k})+1, fi,j,k=max(fi1,j,k,fi,j1,k)+1, s [ i ] [ j ] = ‘ 1 ’ s[i][j]=‘1’ s[i][j]=‘1’
f i , j , k = m a x ( f i − 1 , j , k , f i , j − 1 , k ) , f_{i,j,k}=max(f_{i-1,j,k},f_{i,j-1,k}), fi,j,k=max(fi1,j,k,fi,j1,k), k = 0 & & s [ i ] [ j ] = ‘ ? ’ k=0\&\&s[i][j]=‘?’ k=0&&s[i][j]=?
f i , j , k = m a x ( f i − 1 , j , k , f i , j − 1 , k , f i − 1 , j , k − 1 + 1 , f i , j − 1 , k − 1 + 1 ) , f_{i,j,k}=max(f_{i-1,j,k},f_{i,j-1,k},f_{i-1,j,k-1}+1,f_{i,j-1,k-1}+1), fi,j,k=max(fi1,j,k,fi,j1,k,fi1,j,k1+1,fi,j1,k1+1), k ≠ 0 & & s [ i ] [ j ] = ‘ ? ’ k\neq0\&\&s[i][j]=‘?’ k=0&&s[i][j]=?

三层循环500*500*1000空间会炸,由于我们只用到了当前层和前一层的结果,所以就可以进行经典的滚动数组优化即可。由于是多测,记得初始化,不要无脑用memset(会TLE)。

参考代码:

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1010 , M =510;
const int mod = 1e9 + 7;
const int cases = 1;

int f[2][M][N];
int n,m,x;
char s[M][M];
void Showball(){
    cin>>n>>m>>x;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++) {
            cin>>s[i][j];
        }
    }
        for(int j=1;j<=m;j++){
            for(int k=0;k<=x;k++){
                f[0][j][k]=0;
                f[1][j][k]=0;
            }
        }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            for(int k=0;k<=x;k++){
              if(s[i][j]=='0') f[i&1][j][k]=max(f[(i-1)&1][j][k],f[i&1][j-1][k]);
              else if(s[i][j]=='1') f[i&1][j][k]=max(f[(i-1)&1][j][k],f[i&1][j-1][k])+1;
              else {
                if(!k) f[i&1][j][k]=max(f[(i-1)&1][j][k],f[i&1][j-1][k]);
                else {
                    f[i&1][j][k]=max(f[(i-1)&1][j][k],f[i&1][j-1][k]);
                    f[i&1][j][k]=max({f[i&1][j][k],f[(i-1)&1][j][k-1]+1,f[i&1][j-1][k-1]+1});
                }
              }
            }
        }
    }

    int res=0;
    for(int i=0;i<=x;i++) res=max(res,f[n&1][m][i]);

    cout<<res<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

F Art for Last 贪心+单调队列(Multiset)
题意:给你一个只含有非负整数的数组a,给你正整数k,让你从中随意选出k项,使得这k项任意两数之差绝对值最小值和任意两数之差绝对值最大值的乘积最小,求出这个最小值。

思路:为了方便,我们将任意两数之差绝对值最小值定义为 a m i n amin amin,最大值为 a m a x amax amax。我们先将这个数组进行排序,现在让我们从中选取k个数,由于这些数都是非负数,所以我们可以知道 a m a x amax amax的值就等于选出来的值最大值减去最小值。而 a m i n amin amin等于两两相邻数之差。为了让 a m i n amin amin更小,所以根据贪心策略,我们连续的选k个数,比间隔选k个数的策略是更优的。问题转化为:对于连续的长度为k的区间,求出 a m i n ∗ a m a x amin*amax aminamax的最小值。那么我们就可以来枚举每个连续的长度为k的区间。设左端点为 l l l,右端点是 r r r。容易得知 a m a x = a [ r ] − a [ l ] amax=a[r]-a[l] amax=a[r]a[l],那么对于 a m i n amin amin,就等于这一段区间的相邻数之差的最小值,我们可以提前处理出两数之差的数组b,然后对于定长区间最值,很显然的滑动窗口最值问题,用单调队列维护一下就可以了。记得开long long!ans初始化大一些(血的教训!!!)

参考代码:

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 5e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 0;

LL a[N],b[N],q[N];
int n,k;
void Showball(){
   cin>>n>>k;
   for(int i=0;i<n;i++) {
      cin>>a[i];
   }
   sort(a,a+n);
   for(int i=0;i<n;i++){
      if(i) b[i-1]=a[i]-a[i-1];
   }
   vector<LL> res;
   int kk=k-1;
   int hh=0,tt=-1;
   for(int i=0;i<n-1;i++){
      if(hh<=tt&&i-kk+1>q[hh]) hh++;
      while(hh<=tt&&b[q[tt]]>=b[i]) tt--;
      q[++tt]=i;
      if(i>=kk-1) res.pb(b[q[hh]]);
   }
   LL ans=0x3f3f3f3f3f3f3f3f;
   LL minn=0;
   for(int i=0;i+k-1<n;i++){
      int r=i+k-1;
      minn=res[i];
      ans=min(ans,minn*(a[r]-a[i]));     
   }
   cout<<ans<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

当然本题也可以用multiset解决,每次移动我们把 a [ l ] − a [ l − 1 ] a[l]-a[l-1] a[l]a[l1]删去,然后加上 a [ r ] − a [ r − 1 ] a[r]-a[r-1] a[r]a[r1]即可。
参考代码:

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 5e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 0;

LL a[N],b[N],q[N];
int n,k;
void Showball(){
   cin>>n>>k;
   for(int i=0;i<n;i++) {
      cin>>a[i];
   }
   sort(a,a+n);
   multiset<LL> st;
   for(int i=1;i<k;i++){
      st.insert(a[i]-a[i-1]);
   }
   LL minn=0;
   LL ans=0x3f3f3f3f3f3f3f3f;
   for(int i=0;i+k-1<n;i++){
      int l=i;
      int r=i+k-1;
   
      if(i){
         auto x=st.find(a[l]-a[l-1]);
         st.erase(x);
         st.insert(a[r]-a[r-1]);
      }
      minn=*st.begin();
      ans=min(ans,minn*(a[r]-a[l]));     
   }
   cout<<ans<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

G Toxel与字符画 模拟题
题意:给你两个数让你求出 x y x^y xy,如果结果小于1e18,就用字符画输出整个式子,否则结果输出字符画"INF"。
思路:对于输出直接模拟就可以,比较好实现的方法就是,用三个字符数组,把样例直接粘进去,然后输出的时候截取一下就行,我为了代码优雅,选择了手打分号!(赛场上非要这样建议让手速队友去搞hh),然后说一下这个判是否超过1e18,一开始用快速幂,发现会wa,可能中间就爆了,所以判断不准确,其实,直接循环乘就行,对于底数为1的情况直接输出即可,否则超时。然后中途直接判断即可。
(buyao)参考代码:

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef unsigned long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const LL mod = 1e18;
const int cases = 1;

//龟速幂 a^b mod p
string qmi(LL a, LL b)
{
   LL res=1;
   if(a==1) return "1";
   for(int i=1;i<=b;i++){
    res*=a;
    if(res>mod) return "?";
   }
   
   return to_string(res);
}


string dishu[10][10]={
    "........","........","........","........","........","........","........","........","........","........",
    "........","........","........","........","........","........","........","........","........","........",
    "0000000.","......1.","2222222.","3333333.","4.....4.","5555555.","6666666.","7777777.","8888888.","9999999.",
    "0.....0.","......1.","......2.","......3.","4.....4.","5.......","6.......","......7.","8.....8.","9.....9.",
    "0.....0.","......1.","......2.","......3.","4.....4.","5.......","6.......","......7.","8.....8.","9.....9.",
    "0.....0.","......1.","2222222.","3333333.","4444444.","5555555.","6666666.","......7.","8888888.","9999999.",
    "0.....0.","......1.","2.......","......3.","......4.","......5.","6.....6.","......7.","8.....8.","......9.",
    "0.....0.","......1.","2.......","......3.","......4.","......5.","6.....6.","......7.","8.....8.","......9.",
    "0000000.","......1.","2222222.","3333333.","......4.","5555555.","6666666.","......7.","8888888.","9999999.",
    "........","........","........","........","........","........","........","........","........","........"
};

string zhishu[10][10]={
   "......","......","......","......","......","......","......","......","......","......",
   "00000.","....1.","22222.","33333.","4...4.","55555.","66666.","77777.","88888.","99999.",
   "0...0.","....1.","....2.","....3.","4...4.","5.....","6.....","....7.","8...8.","9...9.",
   "0...0.","....1.","22222.","33333.","44444.","55555.","66666.","....7.","88888.","99999.",
   "0...0.","....1.","2.....","....3.","....4.","....5.","6...6.","....7.","8...8.","....9.",
   "00000.","....1.","22222.","33333.","....4.","55555.","66666.","....7.","88888.","99999.",
   "......","......","......","......","......","......","......","......","......","......",
   "......","......","......","......","......","......","......","......","......","......",
   "......","......","......","......","......","......","......","......","......","......",
   "......","......","......","......","......","......","......","......","......","......"
};

string fuhao[10][2]={
   "........","........................",
   "........","........................",
   "........","IIIIIII.N.....N.FFFFFFF.",
   "........","...I....NN....N.F.......",
   "=======.","...I....N.N...N.F.......",
   "........","...I....N..N..N.FFFFFFF.",
   "=======.","...I....N...N.N.F.......",
   "........","...I....N....NN.F.......",
   "........","IIIIIII.N.....N.F.......",
   "........","........................"
};        
void Showball(){
  LL x,y;
  char c;
  cin>>x>>c>>c>>y>>c;
  string xx=to_string(x);
  string yy=to_string(y);
  string zz=qmi(x,y);
  string ans=xx+"#"+yy+"="+zz;
  for(int i=0;i<10;i++){
    cout<<".";
    int ok=0;
    for(auto c:ans){
        if(c=='=') ok=0,cout<<fuhao[i][0];
        else if(c=='#') ok=1;
        else if(c=='?') cout<<fuhao[i][1];
        else{
            int t=c-'0';
            if(ok) cout<<zhishu[i][t];
            else cout<<dishu[i][t];
        }
    }
    cout<<endl;
  }
  cout<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

H Travel Begins 思维 贪心
题意:给你两个数n和k,表示有k个实数之和为n。你可以随意安排这k个实数的值,求
这k个实数四舍五入之后求和的结果最小值和最大值。
思路:对于最小值来说:我们给k-1个数分配一个无限接近0.5的数,然后剩下的数分给第k个数,设这个数为z,这样前k-1个数对于最小值的贡献为0。如果 z < 0.5 z < 0.5 z<0.5,说明最小值为0,最大值则为n/0.5然后四舍五入即可。如果 z ≥ 0.5 z \geq0.5 z0.5,那么最小值为 z / 0.5 z/0.5 z/0.5,最大值为 n − ( k − 1 ) ∗ 0.5 + k − 1 n-(k-1)*0.5+k-1 nk10.5+k1
参考代码:

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 1;
const double eps = 1e-8;
const double res = 0.49999999999999;

void Showball(){
   int n,k;
   cin>>n>>k;
   double z=n-(k-1)*res;
   int minn=0,maxn=0;
   if(z<0.5){
     maxn=(int)(n/0.5);
     cout<<minn<<" "<<maxn<<endl;
   }else{
     minn=(int)(z+0.5);
     double e=n-(k-1)*0.5;
     maxn=(int)(e+0.5)+k-1;
     cout<<minn<<" "<<maxn<<endl;
   }

}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

K 排列与质数
题意:构造一个长度为n的排列 P = ( P 1 , P 2 , . . . , P n ) P=(P_1,P_2,...,P_n) P=P1,P2,...,Pn,要求满足:
∀ i ∈ [ 1 , n ] , ∣ P i − P i   m o d   n + 1 ∣ \forall i \in [1,n],|P_i-P_{i\ mod\ n+1}| i[1,n],PiPi mod n+1为质数。有解输出任意满足条件的排列,否则输出-1。
思路:遇见这种构造先打个表。打表发现当n小于5时,是无解的。还发现当 5 ≤ n ≤ 9 5 \leq n \leq 9 5n9的时候我们可以直接先排列奇数然后排列偶数即可。但是对于较大的数就不成立了。我们可以尝试2个2个间隔去放,这里提供一种构造思路:
奇数:1,3,5,7…n,n-3,n-5…8,6,4
偶数:1,3,5,7…n-3,n,n-2,n-4…8,6,4
可以发现,现在除了 2 和 n − 1 以外,所有数均已出现,且满足题目的限制。那么我们只需要将这两个数插进合适的位置即可。容易发现一定有解,因为可以将 2 插在 5 和 7 之间,将n − 1 插在 n − 4 和 n − 6 之间。

参考代码:

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 0;

void Showball(){
   int n;
   cin>>n;
   if(n<5) cout<<-1<<endl;
   else if(5<=n&&n<10){
     for(int i=1;i<=n;i+=2) cout<<i<<" ";
     for(int i=2;i<=n;i+=2) cout<<i<<" ";
     cout<<endl;
   }else{
     if(n&1){
       for(int i=1;i<=n;i+=2){
         cout<<i<<" ";
         if(i==5) cout<<2<<" ";
         if(n==11&&i==3) cout<<n-1<<" ";
         else if(n!=11&&i==n-6) cout<<n-1<<" ";
       }
       for(int i=n-3;i>4;i-=2){
         cout<<i<<" ";
       }
       cout<<4<<endl;
     }else{
       for(int i=1;i<=n-3;i+=2){
        cout<<i<<" ";
        if(i==5) cout<<2<<" ";
       }

       for(int i=n;i>4;i-=2){
         cout<<i<<" ";
         if(i==n-4) cout<<n-1<<" ";
       }
       cout<<4<<endl;
     }
   }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

完结撒花~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软考系统规划与管理师笔记】第1篇 信息系统综合知识

目录 写在前面 1. 信息的基本概念 2. 信息的定量描述 3. 信息的传输模型 3. 信息系统的主要性能指标 4. 信息化的层次 5. 电子政务和电子商务 6. 信息系统 6.1 系统开发的方法 6.2 信息系统总体规划 6.3 信息系统规划内容 7 IT战略 8 习题收集 写在前面 系统规划与…

从8连挂到面面offer,我只用了一个月,面试25K测试岗血泪经验分享给你

直到如今&#xff0c;我才敢把这段经历分享出来&#xff0c;毕竟一个多月前&#xff0c;我是经历了面试八连挂的人。作为一只骄傲的软件测试工程师&#xff0c;恨不得找一块豆腐撞死。但是在闭关修炼了一个多月之后&#xff0c;重新出来面试&#xff0c;面试了五家公司&#xf…

《人月神话》译文修订明细(2)-读者可以对照修改

《人月神话》译文修订明细&#xff08;1&#xff09;-读者可以对照修改 《人月神话》译文修订如下&#xff0c;读者可以对照自己手上的书修改。 相关阅读 这回真要动刀子-征集《人月神话》中译本的翻译修正>> 第一章&#xff08;续&#xff09; 原译文 水平边界以下…

Graphpad Prism9.5.1 安装教程 (含Win/Mac版)

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

Mysql中千万数据查询浅析

假如mysql数据库中有一千万数据&#xff0c;如何进行查询&#xff0c;查询效率如何&#xff0c;下面进行简单的分析。 1、准备数据 也许有些人没遇见过上千万数据量的表&#xff0c;没关系&#xff0c;下面通过sql脚本准备一下数据&#xff0c;环境为&#xff1a;mysql5.7. 1…

提示msvcr120.dll丢失怎么办?由于找不到msvcr120.dll如何修复?

msvcr120.dll 是 Microsoft Visual C 文件中的一个重要组件。它是一种动态链接库&#xff0c;包含了很多函数&#xff0c;提供了许多基础的 C 运行时支持。这个库文件的主要功能是提供 C 应用程序的运行时环境&#xff0c;它是一些常用的 C 运行时库文件的集合。这些库包括了 m…

队列:数据结构中的排队之道

本篇博客会讲解队列这种数据结构&#xff0c;并使用C语言实现。 概况 什么是队列呢&#xff1f;队列是一种先进先出的数据结构&#xff0c;即First In First Out&#xff0c;简称FIFO。队列有2端&#xff0c;分别是队头和队尾&#xff0c;规定只能在队尾插入数据&#xff08;…

华为OD机试真题 Java 实现【单核CPU任务调度】【2023Q2 200分】

一、题目描述 现在有一个CPU和一些任务需要处理&#xff0c;已提前获知每个任务的任务D、优先级、所需执行时间和到达时间。 CPU同时只能运行一个任务&#xff0c;请编写一个任务调度程序&#xff0c;采用“可抢占优先权调度”调度算法进行任务调度&#xff0c;规则如 下&…

嵌入式Android系统启动基本分析

目录 第一&#xff1a;Android系统架构图&#xff1a; 第二&#xff1a;Android 系统启动流程如下&#xff1a; 第三&#xff1a;Android 层级分析 第四&#xff1a;案例分析 第五&#xff1a;Android 权限问题 上一篇我们讲了 Linux 系统的启动流程&#xff0c;本文讲解一…

QTableWidget样式设置

QTableWidget的样式分为几个部分&#xff1a; 分别是&#xff1a; 外框&#xff1a;QTableWidget 表头&#xff1a;QHeaderView 表头字段&#xff1a;QHeaderView::section 表格&#xff1a;QTableWidget::item 选中的表格&#xff1a;QTableWidget::item::selected 水平滚动条…

课时七—进程同步(一)

1、同步与互斥的基本概念 1)临界资源 &#xff08;1&#xff09;临界资源&#xff1a;是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式&#xff0c;实现共享的资源称作临界资源。属于临界资源的硬件有&#xff0c;打印机&#xff0c;磁带机等&#xff1b;软件有消息…

javase个人小结

一、数据类型 二、运算符&#xff08;需要注意的&#xff09; /&#xff1a;如果是int类型&#xff0c;那么会保留整数&#xff0c;舍去余数 列如&#xff1a;10/3 3 优先级&#xff1a;拿不准就加括号&#xff0c;括号优先级最高 三、类和对象 什么是封装&#xff0c;继承…

连接器信号完整性仿真教程 三

本文将讲解CST边界&#xff08;Boundary&#xff09;、背景&#xff08;Background&#xff09;的概念及背景材料与边件设置。边界与背景是CST仿真电磁的基础&#xff0c;有必要了解它&#xff0c;并掌握其设置方法与步骤。并以两个实例演示了具体设置的操作。 一 背景、边界与…

深度学习—目标检测标注数据集

深度学习之目标检测 PASCAL数据集 PASCAL VOC挑战赛&#xff08;The PASCAL Visual Object Classes&#xff09;是一个世界级的计算机视觉挑战赛&#xff0c;PASCAL全称&#xff1a;Pattern Analysis&#xff0c;Statical Modeling and Computational Learning&#xff0c;是…

磐维数据库应用案例荣获2022年度杭州商用密码应用优秀案例二等奖

2023年5月8日上午&#xff0c;在2023西湖论剑数字安全大会商用密码应用论坛上发布了2022年度杭州商用密码应用优秀案例&#xff0c;其中由中国移动通信集团浙江有限公司和中移动信息技术有限公司联合申报的 《基于磐维数据库的CRM营销系统商用密码应用案例》荣获二等奖。 20…

Linux下gdb基础命令演示,及命令汇总图

提示&#xff1a;本文主要介绍了什么是gdb&#xff0c;以及gdb指令及其具体使用案例 ————故不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。 文章目录 一、gdb模式下命令一览。1.1基本命令&#xff1a;1.2 断点命令&#xff1a;1.3 数据命令…

实时频谱分析-2.3实时频谱分析

实时频谱分析 频谱分析要想归入实时类别中&#xff0c;必须没有间隙地、不确定地处理关心的频宽内包含的所有信息。RSA 必须获得时域波形中包含的全部信息&#xff0c;把信息转换成频域信号。实时完成这一点必须满足多个重要的信号处理要求&#xff1a; 1&#xff09;提供足够…

【计算思维题】少儿编程 蓝桥杯青少组计算思维真题及详细解析第3套

少儿编程 蓝桥杯青少组计算思维题及详细解析第3套 1、浩浩的左手边是 A、兰兰 B、贝贝 C、青青 D、浩浩 答案:B 考点分析:主要考查小朋友们的观察能力,从给定的图中可以看到:浩浩的左手边是贝贝,所以答案B 2、2 时 30 分,钟面上时针和分针形成的角是什么角 A、钝角…

与vCenter无法通讯时更改虚拟机的网络配置

客户的VCSA由于虚拟机的配置问题导致无法启动&#xff0c;需要通过重新创建VCSA的虚拟机配置的方式来恢复。但是&#xff0c;由于ESXi主机上的所有物理网口都已分配给了分布式网络交换机&#xff0c;在重建虚拟机配置时不能指定标准交换机的端口组来配置网络。而如果将虚拟机的…

找C++程序员工作被卡学历怎么办?我来分享一下实用的方法

当学历低的程序员找C程序员工作时&#xff0c;最担心的问题就是学历卡关。但只有资深的人力资源经理才知道那个行业内的潜规则。对于学历低的程序员来说&#xff0c;这是简直是很难逾越的关卡。 企业招聘程序员时&#xff0c;对学历的要求几乎全是本科及以上学历。这让学历低的…