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

Codeforces Round #644 (Div. 3) G. A/B Matrix

Codeforces Round #436 E. Fire(背包dp+输出路径)