A. Minimal Square
找一个最小的正方形,包含两个a*b的矩形,两矩形无交叉。
- 设较小的数为a,较大的数为b。则正方形边长为:max(2 * a, b)
cin >> t;
while(t--){
cin >> a >> b;
if(a > b) swap(a,b);
if(2 * a >= b) ans = 4 * a * a;
else ans = b * b;
cout << ans << endl;
}
B. Honest Coach
n个数,分为a,b两组,每组至少一个数字。分组满足:|max_a - min_b|值最小
- 将数组排序,寻找最小的相邻元素差的绝对值
cin >> t;
while(t--){
cin >> n;
vector<int> s(n);
for(int i = 0; i < n; i++) cin >> s[i];
ans = inf;
sort(s.begin(), s.end());
for(int i = 0; i < n - 1; i++) ans = min(ans, s[i + 1] - s[i]);
cout << ans << endl;
}
C. Similar Pairs
x,y相似:1. 同奇偶;2.|x - y| == 1。数组a中包含n个数字,判断数组中的这些元素是否可以全部组成(x,y)这样的数对。
-
均为奇数or偶数 -- YES
-
奇偶数均为偶数个 -- YES
-
奇偶数均为奇数个且存在一组以上的元素满足|x - y| == 1,抛开一组|x - y| == 1,其余元素为情况2 -- YES(排序,搜索)
-
其它 -- NO
cin >> t;
while(t--){
b[0] = b[1] = 0;//统计奇偶数个数
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
++b[a[i] & 1];
}
if(b[0] == n || b[1] == n || !(b[0] & 1)) cout << "YES" << endl;
else{
bool flag = false;
sort(a, a + n);
for(int i = 0; i < n - 1; i++){
if(a[i] == a[i + 1] - 1){
flag = true;
break;
}
}
if(flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
D. Buying Shovels
购买n个物品,商品有k类,每一类中有 i 个物品,1 <= i <= k。只能购买一类商品, 满足条件:恰好买n个物品;商品个数最小。
- n <= k, i = n,一件即可;
- n > k,寻找n 的因子中 <= k的最大值 ,件数 = n / 最大de可选因子
cin >> t;
while(t--){
cin >> n >> k;
if(n <= k) cout << "1" << endl;
else{
x = 1;//质数选1
for(int i = 2; i * i <= n && i <= k; i++){//k可能 <= sqrt(n)
if(n % i == 0){
x = i;
if(n / i <= k){
x = n / i;
break;
}
}
}
cout << n / x << endl;
}
}
E. Polygon
询问输入的矩阵可否由全0矩阵得到。修改方式:在n*n的全0阵的最左边和最上边存在2n门炮,每次最多可使用一门炮,直线发射1,直到边界或下一位是1停下来修改当前的0为1。
- 除去右、下边界之外,其余位置的1在下方或者右方存在1才可!
int t,n;
string g[55];
bool judge(int r){
for(int i = 0; i < n - 1; i++){
if(g[r][i] == '1' && g[r][i + 1] != '1' && g[r + 1][i] != '1') return false;
}
return true;
}
int main(void){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> t;
while(t--){
bool flag = true;
cin >> n;
for(int i = 0; i < n; i++) cin >> g[i];
for(int i = 0; i < n - 1; i++){//判断除下边界外的每一行
if(!judge(i)){
flag = false;
break;
}
}
if(flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
F. Spy-string
n个长为m的字符串。能否构造一个字符串s,使s与这些字符串中的每一个最多有一个字符不同。
-
s存在,则与s[0]最多有一个字符不同
-
取s[0],枚举它的所有可能de变化(每次只改变一个字符),与其它的字符串一一比较
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define endl '
'
using namespace std;
int t,n,m;
string cur,s[11];
bool judge(string a){
for(int i = 1; i < n; i++){
int sum = 0;
for(int j = 0; j < m && sum < 2; j++){
if(a[j] != s[i][j]) ++sum;//最多一个字符不同
}
if(sum == 2) return false;
}
return true;
}
int main(void){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> t;
while(t--){
bool flag = false;
cin >> n >> m;
for(int i = 0; i < n; i++) cin >> s[i];
if(judge(s[0])){//s[0]是否满足条件
cout << s[0] << endl;
continue;
}
for(int i = 0; i < m && !flag; i++){
cur = s[0];
for(int j = 0; j < 26; j++){
if('a' + j == s[0][i]) continue;
cur[i] = 'a' + j;
if(judge(cur)){
flag = true;
break;
}
}
}
if(flag) cout << cur << endl;
else cout << "-1" << endl;
}
return 0;
}
G. A/B Matrix
构造一个01矩阵,满足:n行,m列,每一行a个1,每一列b个1。
- n * a == m * b,说明可以构造出这样的矩阵
- 从第一行开始,每行接着上一行最后一个位置开始赋1,循环即可
cin >> t;
while(t--){
memset(g, 0, sizeof g);//矩阵
memset(r, 0, sizeof r);//每一行1的个数
cin >> n >> m >> a >> b;
if(n * a != m * b) cout << "NO" << endl;
else{
int j = 0;
for(int i = 0; i < n; i++){
for(; r[i] < a; j = (j + 1) % m){//按顺序放,循环构造
g[i][j] = 1;
++r[i];
}
}
cout << "YES" << endl;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout << g[i][j];
}
cout << endl;
}
}
}
H. Binary Median
- 待补...