Codeforces Round #644 (Div. 3) A-F
Posted tedukuri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #644 (Div. 3) A-F相关的知识,希望对你有一定的参考价值。
A. Minimal Square
题目大题: 将长宽为a, b的两个相同矩形嵌入正方形中, 问正方形的最小面积.
解题思路: 找到长宽, 并判断两倍的宽是否大于长.
/*
* @Author: Hellcat
* @Date: 2020-05-24 23:54:16
*/
#include <bits/stdc++.h>
using namespace std;
int main() {
int T; cin>>T;
while(T--) {
int a, b; cin>>a>>b;
int Min = min(a, b);
int Max = max(a, b);
if(2*Min >= Max)
cout<<pow(2*Min, 2)<<endl;
else
cout<<pow(Max, 2)<<endl;
}
}
B. Honest Coach
题目大意: 将一个数组分为A, B两组, 使得|max(A)?min(B)|最小.
解题思路: 将数组小到大排序, 找到相邻两个元素最小的差值即为所求.
/*
* @Author: Hellcat
* @Date: 2020-05-24 23:54:16
*/
#include <bits/stdc++.h>
using namespace std;
int a[55];
int main() {
int T; cin>>T;
while(T--) {
int n; cin>>n;
for(int i = 0; i < n; i++) cin>>a[i];
sort(a, a + n);
int Min = 0x3f3f3f3f;
for(int i = 0; i < n-1; i++) {
Min = min(Min, a[i+1] - a[i]);
}
cout<<Min<<endl;
}
}
C. Similar Pairs
题目大意: 定义奇偶性相同的一对数或满足差值为1的一对数(|x?y|=1)为Similar Pairs. 输入的数组元素个数为偶数.
解题思路: 若输入的奇偶个数均为偶数, 则满足配对关系. 否则, 对数组排序后查找是否有满足差值为1的相邻元素. 如果有则满足题意, 否则不满足.
/*
* @Author: Hellcat
* @Date: 2020-05-24 23:54:16
*/
#include <bits/stdc++.h>
using namespace std;
int a[55];
int main() {
int T; cin>>T;
while(T--) {
int n; cin>>n;
int e = 0, d = 0;
for(int i = 0; i < n; i++) {
cin>>a[i];
if(a[i] & 1) d++;
else e++;
}
if((e&1) == 0) { puts("YES"); continue; }
sort(a, a+n);
int diff = 0;
for(int i = 0; i < n - 1; i++) {
diff = a[i+1] - a[i];
if(diff == 1) break;
}
if(diff == 1) { puts("YES"); continue; }
puts("NO");
}
}
D. Buying Shovels
题目大意: 买n个铁锹, 只能从给定的1~k种包装中选择一种, 全部购买这种包装的商品. 求最小购买的商品数量.
解题思路: 首先想到的是暴力枚举, 而1e9的数据量必然TLE, 随后针对暴力解法进行优化. 对特殊情况单独判定后, 结合素数判定的思路, 只要考虑前sqrt(n)的情况. 枚举2~sqrt(n)之间的数, 如果能被整除, 且满足i <= k, 则更新答案. 更新时考虑2种情况, 1)是选择包含i件商品的包裹, 购买n/i件. 2)是满足n/i <= k时选择包含n/i件商品的包裹, 购买i件. 这样一来, 时间复杂度可优化到O(logn)级别.
/*
* @Author: Hellcat
* @Date: 2020-05-24 23:54:16
* https://codeforces.com/contest/1360/problem/D
* D. Buying Shovels
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
int T; cin>>T;
while(T--) {
int n, k; cin>>n>>k;
if(k >= n) { puts("1"); continue; }
if(k == 1) { cout<<n<<endl; continue; }
int m = floor(sqrt(n) + 0.5);
int res = n;
for(int i = 2; i <= m; i++) {
if(n%i == 0 && i <= k) { res = min(res, n/i); if(n/i <= k) res = min(res, i); }
}
cout<<res<<endl;
}
}
E. Polygon
题目大意: 训练发射炮弹, 每次只能从左侧发射到右侧或上方发射到下方, 碰到1或边界为止, 然后将所在位置由0改为1. 满足这样要求的训练输出"YES". 如图所示:
解题思路: 首先想到dfs中的连通图思路, 从右侧及下方的1作为起点遍历. 最后如果没有剩下1则满足题意, 否则不满足. 而这题只有2个方向, 这样做显然有些复杂. 考虑不满足题意的情况, 必然存在一个1其左侧以及下方均为0. 遍历全图判断是否有这样的1即可. 同时注意, 在双重循环内一次break并不能完全跳出, 需要在双重循环外进行输出, 否则会出现输出多个"NO"的情况.
/*
* @Author: Hellcat
* @Date: 2020-05-25 11:44:21
*/
#include <bits/stdc++.h>
using namespace std;
char maze[55][55];
int main() {
int T; cin>>T;
while(T--) {
int n; cin>>n;
for(int i = 1; i <= n; i++) cin>>maze[i]+1;
bool flag = 1;
for(int i = 1; i < n; i++)
for(int j = 1; j < n; j++)
if(maze[i][j] == ‘1‘ && maze[i+1][j] == ‘0‘ && maze[i][j+1] == ‘0‘)
{ flag = 0; break; }
if(flag) puts("YES");
else puts("NO");
}
}
F. Spy-string
题目大意: 给出n个字符串a1, a2, …, an, 如果字符串s对每个字符串都满足不相同字符不超过一个(ai[j] ≠ s[j]), 输出这样的字符串s
解题思路:
/*
* @Author: Hellcat
* @Date: 2020-05-25 14:47:14
*/
#include <bits/stdc++.h>
using namespace std;
string s[11], res;
int n, m;
bool check() {
for(int i = 1; i <= n; i++) {
int cnt = 0;
for(int j = 0; j < m; j++) {
if(s[i][j] != res[j])
cnt++;
if(cnt > 1) return 0;
}
}
return 1;
}
void slove() {
for(int i = 0; i < m; i++) {
for(char ch = ‘a‘; ch <= ‘z‘; ch++) {
res[i] = ch;
if(check()) {
cout<<res<<endl;
return;
}
res[i] = s[1][i]; // 回溯
}
}
puts("-1");
}
int main() {
int T; cin>>T;
while(T--) {
cin>>n>>m;
for(int i = 1; i <= n; i++) cin>>s[i];
res = s[1];
slove();
}
}
以上是关于Codeforces Round #644 (Div. 3) A-F的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #644 (Div. 3) A-F
Codeforces Round #644 (Div. 3) H. Binary Median
Codeforces Round #644(Div.3) 题解
Codeforces Round #644 (Div. 3) H. Binary Median