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
",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
",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
");}
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
");break;
}
}
if(!f){printf("NO
");}
}
}
return 0;
}
D - Buying Shovels
题意: 给一个n和k,求1~k之间哪个数字整除n,是最小的值,求出那个值自己脑瘫写题
写了tle之后,开始wa爆炸了
其实很简单,就判断是否是素数,
然后从小开始除就好了。。。
有点害怕被hack,感觉我那个复杂度刚好要被hack,就先不放代码了
upd,我自己找到数据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
");}
else{printf("No
");}
}
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
");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
");}
else{
for(it i=0;i<n;i++){
string k="";k+=s[i][0];
dfs(0,k);
}
if(f==1){printf("-1
");}
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
");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
");
for(int i=0;i<n;++i){
for(int j=0;j<m;++j) printf("%d",g[i][j]);
printf("
");
}
}
return 0;
}
待补H