Codeforces Round #644 (Div. 3)題解

題目鏈接

A. Minimal Square

題意:
ab給一個長寬分別爲a,b的矩形
問兩個矩形放在一個正方形內,正方形的面積最小爲多少
題解:
分別看矩形的長和寬拼到一起的情況
a,2b長拼到一起的邊爲a,2*b
b,2a寬拼到一起的邊爲b,2*a
同種情況內取最大邊,然後這兩種情況取最小
AC代碼

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
//const int mod=1e9+7;
const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=2e6+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int _;
    cin>>_;
    while(_--){
        int a,b;
        cin>>a>>b;
        int s=max(a,2*b);
        int s1=max(b,2*a);
        int ans=min(s,s1);
        cout<<ans*ans<<endl;
    }
    return 0;
}


B. Honest Coach

題意:
n一個長度爲n數組,分成兩個數列
使使得一個數列的最大值和另一個數列的最小值差最小
求出最小值
題解:
ii+1n直接數組排序,前i個一組,i+1到n一組
用第二組的最小值減第一組的最大值就是結果
所以直接排序後求相鄰數的差
AC代碼

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
//const int mod=1e9+7;
const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

int a[maxn];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int _;
    cin>>_;
    while(_--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        sort(a+1,a+1+n);
        int ans=inf;
        for(int i=2;i<=n;i++){
            ans=min(ans,a[i]-a[i-1]);
        }
        cout<<ans<<endl;
    }
    return 0;
}


C. Similar Pairs

題意:
1如果兩個數奇偶性相同,或者差爲1,則可以組成一對
nn使給n個數(n爲偶數),問能否使得每個數都配對
題解:
n由於n爲偶數,那麼奇數個數和偶數個數奇偶性相同
如果都爲偶,直接各自配對即可
1如果爲奇,看是否都有一對奇數和偶數相差爲1配對
NO如果找不到就NO
AC代碼

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
//const int mod=1e9+7;
const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

int a[110],cnt[110];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int _;
    cin>>_;
    while(_--){
        memset(cnt,0,sizeof cnt);
        int n;
        cin>>n;
        int x=0,y=0;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            cnt[a[i]]++;
            if(a[i]&1)x++;
            else y++;
        }
        bool f=0;
        for(int i=1;i<=n;i++)
            if(cnt[a[i]+1]||cnt[a[i]-1]){f=1;break;}
        if(!f&&(x&1))cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
    return 0;
}


D. Buying Shovels

題意:
n給你一個數n
1k使ppn找一個1-k的數,使得這個數乘p(p爲整數)爲n
p求最小p
題解:
nx1k直接枚舉n的所有因子x,如果這個因子在1-k
n/x那麼計算一下n/x,並取最小值
AC代碼

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
//const int mod=1e9+7;
const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int _;
    cin>>_;
    while(_--){
        int n,k;
        cin>>n>>k;
        int ans=inf;
        for(int i=1;i*i<=n;i++){
            int t=n/i;
            if(n%i==0&&i<=k)ans=min(ans,n/i);
            if(n%t==0&&t<=k)ans=min(ans,n/t);
        }
        cout<<ans<<endl;
    }
    return 0;
}


E. Polygon

題意:
每行左側和每列上側有一個炮臺
每一時刻可以有一個炮臺發出炮彈
炮彈碰到牆壁或者另一個炮彈會停下來並留在原地
問給出的圖是否合法
題意:
由於每行左側和每列上側有炮臺
一個位置想要有炮彈,必須保證他是邊界
使或者他的下面或右邊有一個炮彈使他停止,枚舉判斷即可
AC代碼

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
//const int mod=1e9+7;
const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

char g[100][100];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int _;
    cin>>_;
    while(_--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)cin>>g[i]+1;
        bool f=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(g[i][j]=='1'){
                    if(i==n||j==n)continue;
                    if(g[i][j+1]=='0'&&g[i+1][j]=='0'){f=1;break;}
                }
            }
            if(f)break;
        }
        if(f)cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
    return 0;
}


F. Spy-string

題意:
nm給出n個字符串,長度都爲m
是否能找到一個字符串
n這個字符串和這n個字符串的每一個最多隻有一個不同的字符
題解:
DFS直接DFS暴力枚舉每一個字符
搜索的同時用二進制記錄一個狀態
i記錄第i個字符串能否再出現不同字符
1如果爲1則能,否則不能
100return如果出現且對應狀態爲1,置0,如果對應狀態爲0直接進行return
return然後每次進行回溯,記錄當前字符串,找到後return輸出
AC代碼

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
//const int mod=1e9+7;
const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

bool f;
int n,m,cnt[26];
vector<char> v[20];
char ans[20];
string s[20];
void dfs(int cur){
    if(f)return;
    for(int i=1;i<=n;i++)if(cnt[i]>1)return;
    if(cur==m){
        for(int i=0;i<m;i++)cout<<ans[i];
        cout<<endl;
        f=1;return;
    }
    for(auto i:v[cur]){
        for(int j=1;j<=n;j++)if(s[j][cur]!=i)cnt[j]++;
        ans[cur]=i;
        dfs(cur+1);if(f)return;
        for(int j=1;j<=n;j++)if(s[j][cur]!=i)cnt[j]--;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int _;
    cin>>_;
    while(_--){
        cin>>n>>m;
        for(int i=1;i<=n;i++)cin>>s[i];
        f=0;
        for(int i=0;i<m;i++){
            v[i].clear();
            memset(cnt,0,sizeof cnt);
            for(int j=1;j<=n;j++)
                cnt[s[j][i]-'a']++;
            for(int j=0;j<26;j++)
                if(cnt[j])v[i].pb(j+'a');
        }
        memset(cnt,0,sizeof cnt);
        dfs(0);if(!f)cout<<-1<<endl;
    }
    return 0;
}


G. A/B Matrix

題意:
n,m,a,b給定n,m,a,b
nm你需要找到一個n*m的矩陣
a1b10要求矩陣的每行恰有a個1,每列恰有b個1,其餘爲0
1如果存在構造出來,否則輸出-1
題解:
1先判斷-1的情況
1可以用兩種情況判斷所有1的個數
a1nna如果看行,每行有a個1,一共n行,共有n*a
b1mmb如果看列,每列有b個1,一共m列,共m*b
如果這兩個不相等,說明不能構造
使如果可以構造,那就使每行進行錯位構造
a第一行構造前a個,第二行繼續,如果到了最後一個就重新在第一個構造,直到最後一行
AC代碼

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
//const int mod=1e9+7;
const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

int g[100][100];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int _;
    cin>>_;
    while(_--){
        int n,m,a,b;
        cin>>n>>m>>a>>b;
        memset(g,0,sizeof g);
        if(n*a!=m*b){cout<<"NO"<<endl;continue;}
        cout<<"YES"<<endl;
        int x=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<a;j++){
                g[i][x++]=1;
                if(x==m)x=0;
            }
        for(int i=0;i<n;i++,cout<<endl)
            for(int j=0;j<m;j++)
                cout<<g[i][j];
    }
    return 0;
}


H. Binary Median

題意:
02m1從0到2^m-1的所有二進制數
n去掉其中給定的n個,進行字典序排序
(k1)/2輸出(k-1)/2的向下取整位置的二進制數
題解:
字典序排序其實就是按二進制數化爲十進制數的大小排序
將給定的二進制數化爲十進制數放入數組
upperbound然後進行二分,對每種情況用upperbound去除掉該情況的去掉的數
然後直到找到所求的位置爲止
然後轉化成二進制輸出
AC代碼

/*
    Author:zzugzx
    Lang:C++
    Blog:blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
//const int mod=1e9+7;
const int mod=998244353;
const double eps = 1e-10;
const double pi=acos(-1.0);
const int maxn=1e6+10;
const ll inf=0x3f3f3f3f;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

ll a[maxn];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int _;
    cin>>_;
    while(_--){
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            string s;
            cin>>s;
            a[i]=0;
            for(int j=0;j<m;j++)
                a[i]=(a[i]<<1)|(s[j]=='1');
        }
        ll ok=((1ll<<m)-n+1)>>1;
        sort(a+1,a+1+n);
        ll l=0,r=(1ll<<m)-1,ans;
        while(l<=r){
            ll mid=l+r>>1;
            ll sz=upper_bound(a+1,a+1+n,mid)-(a+1);
            sz=mid+1-sz;
            if(sz>=ok)ans=mid,r=mid-1;
            else l=mid+1;
        }
        for(int i=m-1;i>=0;i--)
            cout<<((ans>>i)&1);
        cout<<endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章