Codeforces Round #644(Div.3)

A. Minimal Square(签到)

题意:给你两个a*b的矩形,求能包含这两个矩形的最小正方形。两个矩形要平行于正方形。

题记:想要正方形面积最小,肯定是让长的那条边重合,形成一个(a+a)*b的矩形,取这个矩形的最长的边即正方形的边长。

#include<bits/stdc++.h>

using namespace std;

int main(){
    int T;
    cin>>T;
    while(T--){
        int a,b;
        cin>>a>>b;
        if(a>b) swap(a,b);
        if(a+a>b)
            cout<<(a+a)*(a+a)<<endl;
        else
            cout<<b*b<<endl;
    }
    return 0;
}

B. Honest Coach(排序)

题意:每个运动员都有一个力量值,将n个运动员分成两组,求A组力量值最大的运动员减去B组力量值最小的运动员的值。使这个值最小。

题记:排下序,求出相邻两个数之间的差的最小值即是答案。

#include<bits/stdc++.h>

using namespace std;
const int N=100,INF=0x3f3f3f3f;
int a[N];
int main(){
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        sort(a+1,a+n+1);
        int ans=INF;
        for(int i=2;i<=n;i++){
            ans=min(a[i]-a[i-1],ans);
        }
        cout<<ans<<endl;
    }
    return 0;
}

C. Similar Pairs(思维)

题意:每两个数分为一组,当这两个数都为偶数或者都为奇数或者相差为1时才能分为一组。求是否能分完所有数。

题记:记录下奇数和偶数的数量,当出现一个奇数个奇数和奇数个偶数时,排序数组,遍历一遍看是否有相差为1的两个数,没有输出NO,其余情况都是YES。

#include<bits/stdc++.h>

using namespace std;
const int N=1010,INF=0x3f3f3f3f;
int a[N];
int main(){
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        int sum1=0,sum2=0;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(a[i]%2==0)
                sum1++;
            else
                sum2++;
        }
        if(sum1%2==1){
            sort(a+1,a+1+n);
            bool flag=false;
            for(int i=2;i<=n;i++){
                if(a[i]==a[i-1]+1){
                    flag=true;
                    break;
                }
            }
            if(flag)cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        else{
            cout<<"YES"<<endl;
        }
    }
    return 0;
}

D. Buying Shovels(约数)

题意:有1到k种包装,求最少能拿多少次(同一包装)能拿到n个。

题记:只有是n的约数的包装才能拿,那么取约数中不超过k的最大值即可。

#include<bits/stdc++.h>

using namespace std;
const int N=1010,INF=0x3f3f3f3f;
int a[N];
int main(){
    int T;
    cin>>T;
    while(T--){
        int n,k;
        cin>>n>>k;
        vector<int>ans;
        for(int i=1;i<=n/i;i++){
            if(n%i==0){
                ans.push_back(i);
                if(i!=n/i)ans.push_back(n/i);
            }
        }
        sort(ans.begin(),ans.end());
        for(int i=ans.size()-1;i>=0;i--){
            if(ans[i]<=k){
                cout<<n/ans[i]<<endl;
                break;
            }
        }
    }
    return 0;
}

E. Polygon(思维)

题意:有个nn的矩阵,2n个炮塔,炮弹射出时会沿直线走,直到碰到一枚炮弹或者到达地图边缘。给出一个n*n的矩阵,问是否存在这个矩阵的情况。

题记:只要判断一颗炮弹右边和下边有无炮弹或者是否边缘即可。

#include<bits/stdc++.h>

using namespace std;
const int N=60,INF=0x3f3f3f3f;
char a[N][N];

int main(){
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                cin>>a[i][j];
        bool flag=true;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if(i==n||j==n)
                continue;
            if(a[i][j]=='1'&&a[i][j+1]=='0'&&a[i+1][j]=='0')
                flag=false;
        }
        if(flag)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

F. Spy-string(枚举)

题意:求一个字符串,这个字符串与每个字符串只能有一个字符不同。

题记:直接暴力枚举O(n4),以第一个字符串为标准,枚举m个字符和26个字母,然后和剩下的n-1个字符串匹配一下是否符合题意。

#include<bits/stdc++.h>

using namespace std;
const int N=15;
string s[N];
string ans;
int n,m;
bool check(){
    for(int i=0;i<n;i++){
        int cnt=0;
        for(int j=0;j<m;j++){
            if(ans[j]!=s[i][j]){
                cnt++;
                if(cnt>1)
                    return false;
            }
        }
    }
    return true;
}

int main(){
    int T;
    cin>>T;
    while(T--){
        cin>>n>>m;
        for(int i=0;i<n;i++)
            cin>>s[i];
        ans=s[0];
        bool flag=false;
        for(int i=0;i<m;i++){
            for(char c='a';c<='z';c++){
                ans[i]=c;
                if(check()){
                    flag=true;
                    break;
                }
            }
            if(flag)break;
            ans[i]=s[0][i];
        }
        if(flag)
            cout<<ans<<endl;
        else
            cout<<-1<<endl;
    }
    return 0;
}

G. A/B Matrix(构造)

题意:n*m的网格,每行有a个1,每列有b个1

题记:要满足题目条件必须满足na=mb。如果满足就直接构造即可。

#include<bits/stdc++.h>

using namespace std;
const int N=110;
char s[N][N];
int main(){
    int T;
    cin>>T;
    while(T--){
        int n,m,a,b;
        cin>>n>>m>>a>>b;
        if(n*a!=m*b){
            cout<<"NO"<<endl;
            continue;
        }
        memset(s,'0',sizeof(s));
        int j=0;
        for(int i=0;i<n;i++){
            for(int k=0;k<a;k++){
                s[i][j]='1';
                j++;
                j%=m;
            }
        }
        cout<<"YES"<<endl;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++)
                cout<<s[i][j];
            cout<<endl;
        }
    }
    return 0;
}

H(待补)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值