A题 直接把问号全部变为陆地如果所有陆地连通 那么再逐个把刚才变成陆地的问号变为水如果依旧连通有多种解
为什么我的代码跑不过去,和网上的题解思路一模一样!!??
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define MAX_N 55 using namespace std; char map[MAX_N][MAX_N]; int n,m; int cnt_s; int cnt_p; int cnt; int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1}; bool vis[MAX_N][MAX_N]; void dfs(int sx,int sy) { vis[sx][sy]=true; for(int i=0;i<4;i++) { int tx=sx+dx[i]; int ty=sy+dy[i]; if(tx>=0&&tx<n&&ty>=0&&ty<m&&map[tx][ty]!='#'&&!vis[tx][ty]) { cnt++; if(map[tx][ty]=='?') map[tx][ty]='*';//标记走过的? vis[tx][ty]=true; dfs(tx,ty); } } return ; } int main(void) { while(scanf("%d%d",&n,&m)==2) { cnt_p=0; int sx,sy; for(int i=0;i<n;i++) scanf("%s",map[i]); memset(vis,false,sizeof(vis)); int k=0;//k块陆地 for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(map[i][j]=='.'&&!vis[i][j]) { k++; cnt=1; dfs(i,j); sx=i; sy=j; } } } if(k>1) { printf("Impossible "); continue; } cnt_s=cnt; bool ok=false; for(int i=0;i<n&&!ok;i++) { for(int j=0;j<m&&!ok;j++) { cnt=1; if(map[i][j]=='*') { memset(vis,false,sizeof(vis)); map[i][j]='#'; dfs(sx,sy); if(cnt==cnt_s-1) ok=true; map[i][j]='.'; } } } if(ok) printf("Ambiguous "); else { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(map[i][j]=='.') printf("."); else printf("#"); } printf(" "); } } } return 0; }
B题 判断有几个点在原位置上 偶数个直接两两互换,奇数个前三个互换 后面两两互换,特判只有一个的时候
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn= 200005; const int maxm= 1e4+10; const int inf = 0x3f3f3f3f; typedef long long ll; int a[maxn],b[maxn]; int n; int main() { while(cin>>n) { int cnt=0; for(int i=1;i<=n;i++) { cin>>a[i]; if(a[i]==i) b[cnt++]=a[i]; } if(cnt==0) cout<<0<<endl; else if(cnt==1) { cout<<cnt<<endl; if(b[0]-1==0) cout<<b[0]<<" "<<b[0]+1<<endl; else cout<<b[0]<<" "<<b[0]-1<<endl; } else if(cnt%2==0) { cout<<cnt/2<<endl; for(int i=1;i<cnt;i=i+2) cout<<b[i]<<" "<<b[i-1]<<endl; } else { cout<<(cnt-3)/2+2<<endl; for(int i=1;i<=2;i++) cout<<b[i]<<" "<<b[0]<<endl; for(int i=3;i<cnt;i=i+2) { cout<<b[i]<<" "<<b[i+1]<<endl; } } } }
C题 大于最大差小于最小和
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn= 200005; const int maxm= 1e4+10; const int inf = 0x3f3f3f3f; typedef long long ll; int a[maxn],b[maxn]; int n; int main() { while(cin>>n) { for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); int x=a[1]+a[2]; int y=a[n]-a[1]; if(x-y>=2) cout<<"YES"<<endl<<y+1<<endl; else cout<<"NO"<<endl; } }
F题 直接列出方程来 解二元一次方程 精度问题真的头疼。。为什么我的代码就不对 贴一个大佬二分写的
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn = 2e5+10; const int maxm = 1e4+10; const int inf = 0x3f3f3f3f; const double epx = 1e-10; typedef long long ll; int n; int xx1,yy1,xx2,yy2; int vxx1,vyy1,vxx2,vyy2; double solve(double t) { int A=xx1-xx2; int A1=vxx1-vxx2; int B=yy1-yy2; int B1=vyy1-vyy2; return (A+A1*t)*(A+A1*t)+(B+B1*t)*(B+B1*t); } int main() { while(scanf("%d %d %d %d",&xx1,&yy1,&xx2,&yy2)!=EOF) { scanf("%d %d %d %d",&vxx1,&vyy1,&vxx2,&vyy2); double ans=0; double l=0,r=1e6; while(r-l>epx) { double mid=(l+r)/2; double midmid=(mid+r)/2; if(solve(mid)<=solve(midmid)) r=midmid; else l=mid; } ans=sqrt(solve((l+r)/2)); printf("%.10f ",ans); } }
G题 八种情况直接暴力模拟
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn= 200005; const int maxm= 1e4+10; const int inf = 0x3f3f3f3f; typedef long long ll; int a[maxn],b[maxn]; int n,m; int main() { while(cin>>n>>m) { int x,y; int x1,y1; cin>>x>>y>>x1>>y1; int flag=0; if((x>n&&x>m)||(y>n&&y>m)||(x1>n&&x1>m)||(y1>n&&y1>m)) flag=0; else if((x+x1<=n&&max(y,y1)<=m)||(x+y1<=n&&max(x1,y)<=m)||(y+x1<=n&&max(x,y1)<=m)||(y+y1<=n&&max(x,x1)<=m)||(x+x1<=m&&max(y,y1)<=n)||(x+y1<=m&&max(x1,y)<=n)||(y+x1<=m&&max(x,y1)<=n)||(y+y1<=m&&max(x,x1)<=n)) flag=1; if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
K题 回文串 两种情况两边开始比较第一次遇到不同的 删右边或者删左边 删完之后若还有不同行不通 一边成立就YES 两边都不成立NO
我想的有点多写麻烦了 贴的队友的代码
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> using namespace std; const int N=1e6+10; char a[N]; int main() { while(~scanf("%s",a)) { int len=strlen(a); int flag1=0,flag2=0; int num=0,num1=0,num2=0; for(int i=0; i<len/2; i++) { if(a[i]==a[len-1-i])num++; else { flag1=i; flag2=len-1-i; break; } } //cout<<flag1<<" "<<flag2<<endl; for(int i=flag1+1; i<=len/2; i++) { if(a[i]!=a[len-1-i+1]) { num1++; break; } } for(int i=flag1; i<len/2; i++) { if(a[i]!=a[len-1-i-1]) { num2++; break; } } //cout<<num<<" "<<num1<<" "<<num2<<endl; if(num==len/2) { printf("YES %d ",len/2+1); } else if(num1==0) { printf("YES "); printf("%d ",flag1+1); } else if(num2==0) { printf("YES "); printf("%d ",flag2+1); } else printf("NO "); } return 0; }
L题 分别算出两支队在比赛中最多赢得场次 从而判断能不能获胜(大于n/2)
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn= 2e5+10; const int maxm= 1e4+10; const int inf = 0x3f3f3f3f; typedef long long ll; int n; int a[maxn],b[maxn]; int main() { while(cin>>n) { for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i]; sort(a+1,a+n+1); sort(b+1,b+n+1); int maxa=0,maxb=0,mina,minb,p=0; for(int i=1,j=1;i<=n;) { if(a[i]>b[j]) { maxa++; i++; j++; } else { i++; } } minb=n-maxa; for(int i=1,j=1;i<=n;) { if(b[i]>a[j]) { maxb++; i++; j++; } else { i++; } } mina=n-maxb; // cout<<maxa<<" "<<mina<<endl; // cout<<maxb<<" "<<minb<<endl; if(maxa>n/2) { if(maxb>n/2) printf("Both "); else printf("First "); } else { if(maxb>n/2) printf("Second "); else printf("None "); } } }