Codeforces Round #644 (Div. 3) A~G

A - Minimal Square

题意:

给两个长为n,宽为m的矩形,问两个矩形不重叠,能被多小的正方形覆盖,求出最小的正方形面积

思路:
先比较2n,2m哪个小,再比较,2n<=m or 2m<n的情况

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
#define ios ios::sync_with_stdio(false)
const int maxn=1e6+10;
const int mo=1e9;
ll ksm(ll a,ll b){if(b<0)return 0;ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;}
const double pi=acos(-1.0);
int t;
int n,m;
int main() {
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        int a=min(n*2,m*2);
        if(n*2<=m){
            a=m;
        }
        if(m*2<=n){
            a=n;
        }
        printf("%d\n",a*a);
    }
    return 0;
}

B - Honest Coach

水题就放代码了,就是求排完序之后两个数之间的最小差

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
#define ios ios::sync_with_stdio(false)
const int maxn=1e3+10;
const int mo=1e9;
ll ksm(ll a,ll b){if(b<0)return 0;ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;}
const double pi=acos(-1.0);
int t;
int n,m;
int a[maxn];
int main() {
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(it i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        int minn=abs(a[1]-a[0]);
        for(it i=2;i<n;i++){
            minn=min(minn,a[i]-a[i-1]);
        }
        printf("%d\n",minn);
    }
    return 0;
}

C - Similar Pairs

被题意忽悠了一下,仔细一下,就是数组有多少奇偶,
如果奇数个数是偶数的就是YES(数组一定是偶数,所以偶数个数也是偶数,成对的),如果奇偶不是偶数,排一下序,看看两数差有没有1的,有1是YES,反之NO

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
#define ios ios::sync_with_stdio(false)
const int maxn=1e2+10;
const int mo=1e9;
ll ksm(ll a,ll b){if(b<0)return 0;ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;}
const double pi=acos(-1.0);
int t;
int n,m;
int a[maxn];
int main() {
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int ge=0;
        for(it i=0;i<n;i++){
            scanf("%d",&a[i]);
            if(a[i]&1){ge++;}
        }
        if(ge%2==0){printf("YES\n");}
        else{
            sort(a,a+n);
            int f=0;
            for(int i=1;i<n;i++){
                if(a[i]-a[i-1]==1){
                    f=1;printf("YES\n");break;
                }
            }
            if(!f){printf("NO\n");}
        }
    }
    return 0;
}

D - Buying Shovels

题意: 给一个n和k,求1~k之间哪个数字整除n,是最小的值,求出那个值

自己脑瘫写题
写了tle之后,开始wa爆炸了
其实很简单,就判断是否是素数,
然后从小开始除就好了。。。

有点害怕被hack,感觉我那个复杂度刚好要被hack,就先不放代码了

ps,我自己找到数据hack掉了

花了点时间看了别人的代码,觉得我比赛时候可能wa傻了,sqrt都能忘。这个应该不会被hack的

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
#define ios ios::sync_with_stdio(false)
const int maxn=1e2+10;
const int mo=1e9;
ll ksm(ll a,ll b){if(b<0)return 0;ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;}
const double pi=acos(-1.0);
int t;
int n,m,a,b;

int main(){
    ios;
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		int n,k;
		cin>>n>>k;
		int ans=inf;
		for(int i=1;i*i<=n;i++)
			if(n%i==0)
			{
				if(n/i<=k) ans=min(ans,i);
				if(i<=k) ans=min(ans,n/i);
			}
		cout<<ans<<endl;
	}
    return 0;
}

E - Polygon

按照题意的意思就是找这个点是否为1 ,如果为1 他的右边和下面必有一个1,除非在右边界或者下边界。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
#define ios ios::sync_with_stdio(false)
const int maxn=1e2+10;
const int mo=1e9;
ll ksm(ll a,ll b){if(b<0)return 0;ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;}
const double pi=acos(-1.0);
int t;
int n,k;
char s[55][55];
int main() {
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(it i=0;i<n;i++){
            scanf("%s",s[i]);
        }
        int f=1;
        for(it i=0;i<n-1;i++){
            for(it j=0;j<n-1;j++){
                if(s[i][j]=='1' && s[i+1][j]=='0' && s[i][j+1]=='0'){f=0;break;}
            }
            if(!f){break;}
        }
        if(f){printf("Yes\n");}
        else{printf("No\n");}
    }
    return 0;
}

F - Spy-string

题意:
给长度小于10的字符串,个数小于10,问能不能有这么一个长度一样的字符串,与每个字符串比较,只有一个或者0个不一样的字母

思路
暴搜

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
#define ios ios::sync_with_stdio(false)
const int maxn=1e2+10;
const int mo=1e9;
ll ksm(ll a,ll b){if(b<0)return 0;ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;}
const double pi=acos(-1.0);
int t;
int n,m;
char s[15][15];
int a[15][15];
int vis[15],f=1;
string ans;
void dfs(int p,string ss){
    if(f==0){return;}
    if(p==m){f=0;ans=ss;return;}
    for(it i=0;i<n;i++){
        int ge=0;
        for(it j=0;j<=p;j++){
            if(ss[j]!=s[i][j]){ge++;}
        }
        if(ge>=2){return;}
    }
    if(p==m-1){dfs(m,ss);}
    else{
        for(it i=0;i<n;i++){
            string kk=ss;kk+=s[i][p+1];
            dfs(p+1,kk);
        }
    }
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(it i=0;i<n;i++){
            scanf("%s",s[i]);vis[i]=0;
        }
        if(m==1){printf("a\n");continue;}
        f=1;
        for(it i=1;i<n;i++){
            int ge=0;
            for(it j=0;j<m;j++){
                if(s[0][j]!=s[i][j]){ge++;}
            }
            if(ge>=4){f=0;break;}
        }
        if(!f){printf("-1\n");}
        else{
              for(it i=0;i<n;i++){
                string k="";k+=s[i][0];
                dfs(0,k);
              }
              if(f==1){printf("-1\n");}
              else{
                  cout<<ans<<endl;
              }
        }
    }
    return 0;
}

G - A/B Matrix

题意:
给一个n,m的矩阵,再给a,b,表示每行有a个1,每列有b个1,有这样的矩阵吗,有输出,没有NO

思路:
n * a!= b * m的就是no

其他就进行构造就行了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
#define ios ios::sync_with_stdio(false)
const int maxn=1e2+10;
const int mo=1e9;
ll ksm(ll a,ll b){if(b<0)return 0;ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;}
const double pi=acos(-1.0);
int t;
int n,m,a,b;
int g[100][100];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d%d",&n,&m,&a,&b);
        if(n*a!=m*b){printf("NO\n");continue;}
        mem(g,0);
        for(int i=0,j=0;i<n;++i){
			for(int k=a;k;j++,j%=m,--k){
				g[i][j]=1;
			}
		}
        printf("YES\n");
        for(int i=0;i<n;++i){
            for(int j=0;j<m;++j) printf("%d",g[i][j]);
            printf("\n");
        }
		
    }
    return 0;
}

待补H

猜你喜欢

转载自www.cnblogs.com/luoyugongxi/p/12953777.html
今日推荐