题目链接
题意:
给 一 个 长 宽 分 别 为 a , b 的 矩 形 给一个长宽分别为a,b的矩形 给一个长宽分别为a,b的矩形
问 两 个 矩 形 放 在 一 个 正 方 形 内 , 正 方 形 的 面 积 最 小 为 多 少 问两个矩形放在一个正方形内,正方形的面积最小为多少 问两个矩形放在一个正方形内,正方形的面积最小为多少
题解:
分 别 看 矩 形 的 长 和 宽 拼 到 一 起 的 情 况 分别看矩形的长和宽拼到一起的情况 分别看矩形的长和宽拼到一起的情况
长 拼 到 一 起 的 边 为 a , 2 ∗ b 长拼到一起的边为a,2*b 长拼到一起的边为a,2∗b
宽 拼 到 一 起 的 边 为 b , 2 ∗ a 宽拼到一起的边为b,2*a 宽拼到一起的边为b,2∗a
同 种 情 况 内 取 最 大 边 , 然 后 这 两 种 情 况 取 最 小 同种情况内取最大边,然后这两种情况取最小 同种情况内取最大边,然后这两种情况取最小
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include
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;
}
题意:
一 个 长 度 为 n 数 组 , 分 成 两 个 数 列 一个长度为n数组,分成两个数列 一个长度为n数组,分成两个数列
使 得 一 个 数 列 的 最 大 值 和 另 一 个 数 列 的 最 小 值 差 最 小 使得一个数列的最大值和另一个数列的最小值差最小 使得一个数列的最大值和另一个数列的最小值差最小
求 出 最 小 值 求出最小值 求出最小值
题解:
直 接 数 组 排 序 , 前 i 个 一 组 , i + 1 到 n 一 组 直接数组排序,前i个一组,i+1到n一组 直接数组排序,前i个一组,i+1到n一组
用 第 二 组 的 最 小 值 减 第 一 组 的 最 大 值 就 是 结 果 用第二组的最小值减第一组的最大值就是结果 用第二组的最小值减第一组的最大值就是结果
所 以 直 接 排 序 后 求 相 邻 数 的 差 所以直接排序后求相邻数的差 所以直接排序后求相邻数的差
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include
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;
}
题意:
如 果 两 个 数 奇 偶 性 相 同 , 或 者 差 为 1 , 则 可 以 组 成 一 对 如果两个数奇偶性相同,或者差为1,则可以组成一对 如果两个数奇偶性相同,或者差为1,则可以组成一对
给 n 个 数 ( n 为 偶 数 ) , 问 能 否 使 得 每 个 数 都 配 对 给n个数(n为偶数),问能否使得每个数都配对 给n个数(n为偶数),问能否使得每个数都配对
题解:
由 于 n 为 偶 数 , 那 么 奇 数 个 数 和 偶 数 个 数 奇 偶 性 相 同 由于n为偶数,那么奇数个数和偶数个数奇偶性相同 由于n为偶数,那么奇数个数和偶数个数奇偶性相同
如 果 都 为 偶 , 直 接 各 自 配 对 即 可 如果都为偶,直接各自配对即可 如果都为偶,直接各自配对即可
如 果 为 奇 , 看 是 否 都 有 一 对 奇 数 和 偶 数 相 差 为 1 配 对 如果为奇,看是否都有一对奇数和偶数相差为1配对 如果为奇,看是否都有一对奇数和偶数相差为1配对
如 果 找 不 到 就 N O 如果找不到就NO 如果找不到就NO
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include
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;
}
题意:
给 你 一 个 数 n 给你一个数n 给你一个数n
找 一 个 1 − k 的 数 , 使 得 这 个 数 乘 p ( p 为 整 数 ) 为 n 找一个1-k的数,使得这个数乘p(p为整数)为n 找一个1−k的数,使得这个数乘p(p为整数)为n
求 最 小 p 求最小p 求最小p
题解:
直 接 枚 举 n 的 所 有 因 子 x , 如 果 这 个 因 子 在 1 − k 直接枚举n的所有因子x,如果这个因子在1-k 直接枚举n的所有因子x,如果这个因子在1−k
那 么 计 算 一 下 n / x , 并 取 最 小 值 那么计算一下n/x,并取最小值 那么计算一下n/x,并取最小值
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include
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;
}
题意:
每 行 左 侧 和 每 列 上 侧 有 一 个 炮 台 每行左侧和每列上侧有一个炮台 每行左侧和每列上侧有一个炮台
每 一 时 刻 可 以 有 一 个 炮 台 发 出 炮 弹 每一时刻可以有一个炮台发出炮弹 每一时刻可以有一个炮台发出炮弹
炮 弹 碰 到 墙 壁 或 者 另 一 个 炮 弹 会 停 下 来 并 留 在 原 地 炮弹碰到墙壁或者另一个炮弹会停下来并留在原地 炮弹碰到墙壁或者另一个炮弹会停下来并留在原地
问 给 出 的 图 是 否 合 法 问给出的图是否合法 问给出的图是否合法
题意:
由 于 每 行 左 侧 和 每 列 上 侧 有 炮 台 由于每行左侧和每列上侧有炮台 由于每行左侧和每列上侧有炮台
一 个 位 置 想 要 有 炮 弹 , 必 须 保 证 他 是 边 界 一个位置想要有炮弹,必须保证他是边界 一个位置想要有炮弹,必须保证他是边界
或 者 他 的 下 面 或 右 边 有 一 个 炮 弹 使 他 停 止 , 枚 举 判 断 即 可 或者他的下面或右边有一个炮弹使他停止,枚举判断即可 或者他的下面或右边有一个炮弹使他停止,枚举判断即可
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include
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;
}
题意:
给 出 n 个 字 符 串 , 长 度 都 为 m 给出n个字符串,长度都为m 给出n个字符串,长度都为m
是 否 能 找 到 一 个 字 符 串 是否能找到一个字符串 是否能找到一个字符串
这 个 字 符 串 和 这 n 个 字 符 串 的 每 一 个 最 多 只 有 一 个 不 同 的 字 符 这个字符串和这n个字符串的每一个最多只有一个不同的字符 这个字符串和这n个字符串的每一个最多只有一个不同的字符
题解:
直 接 D F S 暴 力 枚 举 每 一 个 字 符 直接DFS暴力枚举每一个字符 直接DFS暴力枚举每一个字符
搜 索 的 同 时 用 二 进 制 记 录 一 个 状 态 搜索的同时用二进制记录一个状态 搜索的同时用二进制记录一个状态
记 录 第 i 个 字 符 串 能 否 再 出 现 不 同 字 符 记录第i个字符串能否再出现不同字符 记录第i个字符串能否再出现不同字符
如 果 为 1 则 能 , 否 则 不 能 如果为1则能,否则不能 如果为1则能,否则不能
如 果 出 现 且 对 应 状 态 为 1 , 置 0 , 如 果 对 应 状 态 为 0 直 接 进 行 r e t u r n 如果出现且对应状态为1,置0,如果对应状态为0直接进行return 如果出现且对应状态为1,置0,如果对应状态为0直接进行return
然 后 每 次 进 行 回 溯 , 记 录 当 前 字 符 串 , 找 到 后 r e t u r n 输 出 然后每次进行回溯,记录当前字符串,找到后return输出 然后每次进行回溯,记录当前字符串,找到后return输出
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include
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;
}
题意:
给 定 n , m , a , b 给定n,m,a,b 给定n,m,a,b
你 需 要 找 到 一 个 n ∗ m 的 矩 阵 你需要找到一个n*m的矩阵 你需要找到一个n∗m的矩阵
要 求 矩 阵 的 每 行 恰 有 a 个 1 , 每 列 恰 有 b 个 1 , 其 余 为 0 要求矩阵的每行恰有a个1,每列恰有b个1,其余为0 要求矩阵的每行恰有a个1,每列恰有b个1,其余为0
如 果 存 在 构 造 出 来 , 否 则 输 出 − 1 如果存在构造出来,否则输出-1 如果存在构造出来,否则输出−1
题解:
先 判 断 − 1 的 情 况 先判断-1的情况 先判断−1的情况
可 以 用 两 种 情 况 判 断 所 有 1 的 个 数 可以用两种情况判断所有1的个数 可以用两种情况判断所有1的个数
如 果 看 行 , 每 行 有 a 个 1 , 一 共 n 行 , 共 有 n ∗ a 如果看行,每行有a个1,一共n行,共有n*a 如果看行,每行有a个1,一共n行,共有n∗a
如 果 看 列 , 每 列 有 b 个 1 , 一 共 m 列 , 共 m ∗ b 如果看列,每列有b个1,一共m列,共m*b 如果看列,每列有b个1,一共m列,共m∗b
如 果 这 两 个 不 相 等 , 说 明 不 能 构 造 如果这两个不相等,说明不能构造 如果这两个不相等,说明不能构造
如 果 可 以 构 造 , 那 就 使 每 行 进 行 错 位 构 造 如果可以构造,那就使每行进行错位构造 如果可以构造,那就使每行进行错位构造
第 一 行 构 造 前 a 个 , 第 二 行 继 续 , 如 果 到 了 最 后 一 个 就 重 新 在 第 一 个 构 造 , 直 到 最 后 一 行 第一行构造前a个,第二行继续,如果到了最后一个就重新在第一个构造,直到最后一行 第一行构造前a个,第二行继续,如果到了最后一个就重新在第一个构造,直到最后一行
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include
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;
}
题意:
从 0 到 2 m − 1 的 所 有 二 进 制 数 从0到2^m-1的所有二进制数 从0到2m−1的所有二进制数
去 掉 其 中 给 定 的 n 个 , 进 行 字 典 序 排 序 去掉其中给定的n个,进行字典序排序 去掉其中给定的n个,进行字典序排序
输 出 ( k − 1 ) / 2 的 向 下 取 整 位 置 的 二 进 制 数 输出(k-1)/2的向下取整位置的二进制数 输出(k−1)/2的向下取整位置的二进制数
题解:
字 典 序 排 序 其 实 就 是 按 二 进 制 数 化 为 十 进 制 数 的 大 小 排 序 字典序排序其实就是按二进制数化为十进制数的大小排序 字典序排序其实就是按二进制数化为十进制数的大小排序
将 给 定 的 二 进 制 数 化 为 十 进 制 数 放 入 数 组 将给定的二进制数化为十进制数放入数组 将给定的二进制数化为十进制数放入数组
然 后 进 行 二 分 , 对 每 种 情 况 用 u p p e r b o u n d 去 除 掉 该 情 况 的 去 掉 的 数 然后进行二分,对每种情况用upperbound去除掉该情况的去掉的数 然后进行二分,对每种情况用upperbound去除掉该情况的去掉的数
然 后 直 到 找 到 所 求 的 位 置 为 止 然后直到找到所求的位置为止 然后直到找到所求的位置为止
然 后 转 化 成 二 进 制 输 出 然后转化成二进制输出 然后转化成二进制输出
AC代码
/*
Author:zzugzx
Lang:C++
Blog:blog.csdn.net/qq_43756519
*/
#include
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;
}