1号问题
#include <bits/stdc++.h>
using namespace std;
int t,n,a[200005];
int l=0,r=0,ans=0;
string s;
bool check(int x){
//检查删除1的个数能否小于或等于x
int k0=r-x,k1=r-x,c1=0,c2=0,i=0;
while(k0>0){
if(a[i]==0)
k0--;
else
c1++;
i++;
}
i=n-1;
while(k1>0){
if(a[i]==0)
k1--;
else
c2++;
i--;
}
return min(c1,c2)<=x;
}
int main(){
cin>>t;
while(t--){
cin>>s;
n=s.size();
l=0,r=0;
for(int i=0;i<n;i++){
a[i]=s[i]-'0';
if(a[i]==0)
r++;
}
while(l<=r){
int mid=(l+r)/2;
if(check(mid)){
ans=mid;
r=mid-1;
}else
l=mid+1;
}
cout<<ans<<endl;
}
return 0;
}
2号问题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,sx,sy;
ll a[2005][2005];
bool vis[2005][2005];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
struct Node{
int x,y;
};
void bfs(int i,int j){
queue<Node> q;
q.push(Node{i,j});
vis[i][j]=1;
int ans=0;
while(!q.empty()){
Node tmp=q.front();
q.pop();
if(a[sx][sy]==1){
cout<<ans;
exit(0);
}
for(int d=0;d<4;d++){
int xa,ya;
xa=tmp.x+dx[d];
ya=tmp.y+dy[d];
if(xa>0&&xa<=n&&ya>0&&ya<=m&&!vis[xa][ya]){
a[sx][sy]=__gcd(a[xa][ya],a[sx][sy]);
vis[xa][ya]=1;
q.push(Node{xa,ya});
ans++;
}
if(a[sx][sy]==1){
cout<<ans;
exit(0);
}
}
}
cout<<-1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
cin>>sx>>sy;
bfs(sx,sy);
return 0;
}
3号问题
#include <bits/stdc++.h>
using namespace std;
const int n=9,N=17;
char x[n][n],y[n][n];
bool visx[n][n+1],visy[n][n+1],visz[n][n+1];
int a[n][n];
void print(){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return ;
}
void dfs(int i,int j){
if(i==n){
print();
exit(0);
}
for(int k=1;k<=n;k++)
if(!visx[i][k]&&!visy[j][k]&&!visz[i/3*3+j/3][k]){
if(i%3!=0)
if(y[i-1][j]=='^'&&k<=a[i-1][j])
continue;
else if(y[i-1][j]=='v'&&k>=a[i-1][j])
continue;
if(j%3!=0)
if(x[i][j-1]=='<'&&k<=a[i][j-1])
continue;
else if(x[i][j-1]=='>'&&k>=a[i][j-1])
continue;
visx[i][k]=visy[j][k]=visz[i/3*3+j/3][k]=1;
a[i][j]=k;
if(j==n-1)
dfs(i+1,0);
else
dfs(i,j+1);
}
return ;
}
int main(){
for(int i=0;i<n;i++){
int k=0;
for(int j=0;j<6;j++){
char d;
cin>>d;
if(d!=' ')
x[i][k++]=d;
}
if((i+1)%3==0)
continue;
k=0;
for(int j=0;j<n;j++){
char d;
cin>>d;
if(d!=' ')
y[i][k++]=d;
}
}
dfs(0,0);
print();
return 0;
}
//洛谷有这道题
4号问题
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int inf=0x3f3f3f3f;
int t,a,b;
signed main(){
cin>>t;
while(t--){
cin>>a>>b;
while(a>0){
int lg=log(a)/log(2);
if(pow(2,lg)==a) break;
a--;
}
int ans=a,k=1,res=0;
while(ans<b)
ans+=k,k*=2,res++;
cout<<res<<endl;
}
return 0;
}
5号问题
没代码,不会
暂时就这些,希望大佬帮助本蒟蒻