题目链接:https://codeforc.es/gym/104354/attachments
大意是构造一个n的排列,使得所有相邻的数的差的绝对值是素数
这个题是队友做的,狠狠C了一把。
大概的做法就是,小的全排列,大的找规律
当n为奇数时,从1 每次+2构造到n,然后先减3,再一直-2构造到4。最后剩下2和n-1,直接把2放到5的位置,构成2 5 7,把n-1放到n-6的位置,构造n-6 n-1 n-4
当n为偶数时,从1每次+2构造到n,然后一直-2构造到4。最后剩下2和n-1,直接把2放到5的位置,构成2 5 7,把n-1放到n-4的位置,构成n-4 n-1 n-6
code:
void solve() { int n; cin>>n; if(n<=4){ cout<<-1<<endl; return; } if(n<=11){ for(int i=1;i<=n;i++){ a[i] = i; } do{ bool flag = true; for(int i=1;i<=n;i++){ int ff = abs(a[i]-a[i%n+1]); if(ff==2||ff==3||ff==7||ff==5||ff==11) ; else{ flag = false; break; } } if(flag){ for(int i=1;i<=n;i++){ cout<<a[i]<<' '; } cout<<endl; return; } }while(nxtper(a+1,a+n+1)); } if(n&1){ vector<int> ve; for(int i=1;i<=n;i+=2) ve.push_back(i); for(int i=n-3;i>=4;i-=2) ve.push_back(i); for(auto c:ve){ cout<<c<<' '; if(c==5) cout<<2<<' '; if(c==n-6) cout<<n-1<<' '; } cout<<endl; return; }else{ vector<int> ve; for(int i=1;i<=n-3;i+=2) ve.push_back(i); for(int i=n;i>=4;i-=2) ve.push_back(i); for(auto c:ve){ cout<<c<<' '; if(c==5) cout<<2<<' '; if(c==n-4) cout<<n-1<<' '; } cout<<endl; } }
题目链接:https://codeforc.es/contest/1838/problem/C
大意是给出n*m的矩阵,你可以填写1-n*m这些数字。你需要构造出对于任意一个位置,它与上下左右邻居的差的绝对值不为质数。
思路1:对于n为偶数,很好构造,直接1 2 3 4/5 6 7 8 类似这样。
对于n为奇数,奇偶直接错排。
类似:
1 2 3 4
13 14 15 16
5 6 7 8
17 18 19 20
9 10 11 12
code:
void solve() { int n,m; cin>>n>>m; if (n > 4){ int cnt = 0; for(int i = 0; i < n; i += 2){ for(int j = 0; j < m; j++){ a[i][j] = ++cnt; } } for(int i = 1; i < n; i += 2){ for(int j = 0; j < m; j++){ a[i][j] = ++cnt; } } } else{ int cnt = 0; for(int i = 0; i < m; i += 2){ for(int j = 0; j < n; j++){ a[j][i] = ++cnt; } } for(int i = 1; i < m; i += 2){ for(int j = 0; j < n; j++){ a[j][i] = ++cnt; } } } for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ cout << a[i][j] << ' '; } cout << '\n'; } }