题意
题解
代码
#include
using namespace std;
char a[4][4];
bool check(int x,int y) {//检查以该点为左上角的,n=2的方阵是否符合要求
char c=a[x][y];
for(int i=x;i<x+2;i++)
for(int j=y;j<y+2;j++)
if(i<4 && j<4 && a[i][j]!=c) return 0;
if(x<3 && y<3) return 1;
return 0;
}
bool solve() {
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
cin>>a[i][j];
for(int i=0;i<4;i++)//枚举所有点
for(int j=0;j<4;j++)
if(check(i,j)) return 1;
return 0;
}
int main() {
int t; cin>>t;
while(t--) cout<<(solve() ? "Yes":"No")<<'\n';
return 0;
}
题意
题解
代码
#include
#include
using namespace std;
void solve() {
int n; cin>>n;
string s; cin>>s;
int res=1;
for(int i=0;i<n;i++) {//统计02连续段,因为02段是被1隔开,所以只要不是1就行
if(s[i]!='1') {
int j=i;
while(j<n && s[j]!='1') j++;
res=max(res,j-i);
j--; i=j;
}
}
for(int i=0;i<n;i++) {//统计12连续段,同理
if(s[i]!='0') {
int j=i;
while(j<n && s[j]!='0') j++;
res=max(res,j-i);
j--; i=j;
}
}
cout<<res<<'\n';
}
int main() {
int t; cin>>t;
while(t--) solve();
return 0;
}
暴力
#include
#include
#include
using namespace std;
void solve() {
int n; cin>>n;
string s; cin>>s;
int res=1;
for(int i=0;i<n;i++) {
int j=i;
while(j<n && s[j]=='2') j++;//找到第一个不为2的灯,以它作为参照状态
char c=s[j];
while(j<n && (s[j]=='2' || s[j]==c)) j++;//找后面连续的灯
res=max(res,j-i);//更新答案
}
cout<<res<<'\n';
}
int main() {
int t; cin>>t;
while(t--) solve();
return 0;
}
题意
题解
0^1=0,0^2=0,即如果区间符合要求,那么k=0会有两个输出。麻麻麻这里WA麻了,好无语代码
#include
#include
#include
using namespace std;
typedef long long ULL;
void solve() {
ULL l,r,k;
cin>>l>>r>>k;
ULL res=1,cnt=0;
if(k==0 && l<=0 && r>=0) cout<<0<<' ',cnt++;//特判
if(l<=1 && r>=1) cout<<1<<' ',cnt++;
while(k&&k!=1 && res<=r/k) {//数据范围,这样写防止爆long long
res*=k;
if(res>=l && res<=r) cout<<res<<' ',cnt++;
}
if(cnt==0) cout<<"None.";
cout<<'\n';
}
int main() {
int t; cin>>t;
while(t--) solve();
return 0;
}
题意
题解
模拟题。
需要维护的变量:
棋盘的状态 -> g[n][m]=1/2,来表示棋盘及棋子的状态
当前列放棋子落在第几行 -> h[i]表示第i列的高度(行数)
需要维护的操作:
检验当前有无k子连珠 -> check(x,y),以(x,y)为中心去检验四种方向,每种方向正负两个方向去记录连续的相同颜色的棋子数量,数量大于等于k即符合要求
代码
#include
using namespace std;
const int N=1005;
int n,m,k,t;
int g[N][N],h[N];
int dx[4]={1,0,1,-1},dy[4]={0,-1,-1,-1};//单位向量的定义为横竖撇捺四个方向
bool check(int x,int y) {//检验以(x,y)为中心是否存在k子连珠
for(int d=0;d<=3;d++) {//横竖撇捺四种方向检查
int cnt=0;//此方向连续的相同颜色棋子数量
int dxx=dx[d],dyy=dy[d];//偏移量
int tx=x,ty=y;
//不越界且连续颜色相同,正方向有多少个
while(1<=tx&&tx<=n&&1<=ty&&ty<=m && g[tx][ty]==g[x][y]) {
cnt++; tx+=dxx; ty+=dyy;
}
//不越界且连续颜色相同,负方向有多少个
tx=x,ty=y;
while(1<=tx&&tx<=n&&1<=ty&&ty<=m && g[tx][ty]==g[x][y]) {
cnt++; tx-=dxx; ty-=dyy;
}
cnt--;//多记录了(x,y)自身,去除
if(cnt>=k) return 1;
}
return 0;
}
int main() {
cin>>n>>m>>k>>t;
for(int i=1;i<=t;i++) {//注意是t个棋子
int x; cin>>x;
h[x]++;//选择该列,该列的高度增加;注意题目的棋盘是从1开始的
g[h[x]][x]=((i&1) ? 2:1);//black:2;注意颜色是由输入顺序定义的
if(check(h[x],x)) {cout<<i<<'\n'; return 0;}//有答案输出
}
return 0;
}
题意
题解
代码
#include
using namespace std;
const int N=1e6+10;
int n,m,d[N],p[N],seg[N];
int main() {
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>d[i];
for(int i=1;i<=m;i++) cin>>p[i],seg[p[i]]=d[i]+1;
int l=0,r=0,ans=0;
for(int i=1;i<=n;i++) {
if(seg[i]==0) continue;
if(seg[i]==1) ans=max(ans,i-0+r);
else r++;
}
for(int i=n;i>=1;i--) {
if(seg[i]==0) continue;
if(seg[i]==2) ans=max(ans,n+1-i+l);
else l++;
}
cout<<ans<<'\n';
return 0;
}
题意
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BcmuODbM-1666978509437)(/Users/chenyanling/Library/Application Support/typora-user-images/image-20221029002156595.png)]](https://1000bd.com/contentImg/2024/05/24/853bc16be8d74e0e.png)
题解
(a1.cnt * b1.cnt * floor(sqrt(差)),那么只需要枚举a分组和b分组,时间复杂度为O(sqrt(2e7)^2)=O(2e7)代码
#include
#include
#include
using namespace std;
map<int,int> ha,hb;
int sqt(int x,int y) {
return floor(sqrt(abs(x-y)) + 1e-6);//下取整如果是整数计算,加一点精度即可,否则答案不正确
}
int main() {
int n; cin>>n;
for(int i=0;i<n;i++) {
int x; cin>>x;
ha[x]++;
}
for(int i=0;i<n;i++) {
int x; cin>>x;
hb[x]++;
}
long long res=0;
for(auto u:ha)
for(auto v:hb)
res+=1ll*u.second*v.second*sqt(u.first,v.first);
cout<<res<<'\n';
return 0;
}