赞
踩
题意
题解
代码
#include <iostream> 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 <iostream> #include <cstring> 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 <iostream> #include <cstring> #include <algorithm> 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 <iostream> #include <cstring> #include <algorithm> 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 <iostream> 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 <iostream> 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; }
题意
题解
(a1.cnt * b1.cnt * floor(sqrt(差))
,那么只需要枚举a分组和b分组,时间复杂度为O(sqrt(2e7)^2)=O(2e7)代码
#include <iostream> #include <map> #include <cmath> 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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。