题目链接
普及题:
http://acm.zzuli.edu.cn/problem.php?id=1388
提高题:
http://acm.zzuli.edu.cn/problem.php?id=1395
普及题
找规律即可,不需要排序,前[1,n/2]个数是2,4,6…(即2m),后(n/2,n]部分是1,3,5,7,(即2m-1),这里的m是指距前半部分开头的值,或者距后半部分开头的值。判断输入的m的值是否大于n/2,进行相应的计算。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t, n, m;
cin >> t;
while(t--){
cin >> n >> m;
if(m > n/2){
cout << 2*(m-n/2)-1 << endl;
}else{
cout << 2*m << endl;
}
}
}
提高题
这个题也是道简单题,只需要暴力判断每行,每列是否符合要求即可。
我用的方法是用一个大小为10的数组,即check[10],用来储存每行或者每列1-9值出现的次数,数组下标对应的是该值,数组的值对应的是该数出现的次数,只要数组中有值>=2(代表某个数在一行或者一列中出现了2次及以上),就表明不符合要求。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
//在输入的时候顺便判断的每行是否符合要求
int arr[10][10], check[10], sign = 0;
for(int i = 0; i < 9; i++){
memset(check, 0, sizeof(check));
for(int j = 0; j < 9; j++){
cin >> arr[i][j];
check[ arr[i][j] ]++;
if(check[ arr[i][j] ] == 2){
sign = 1;
}
}
}
//判断每列是否符合要求
for(int i = 0; i < 9; i++){
memset(check, 0, sizeof(check));
for(int j = 0; j < 9; j++){
check[ arr[j][i] ]++;
if(check[ arr[i][j] ] == 2){
sign = 1;
}
}
}
if(sign) cout << "No" << endl;
else cout << "Yes" << endl;
}
}