开场连wa三发A题,差点心态崩了,还好坚持打完了,一共A了三题
A题,判断能不能放第一个圆,能放的话,先手比赢

#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=1000+10,maxn=500+100,inf=0x3f3f3f; int main() { ios::sync_with_stdio(false); cin.tie(0); int a,b,r; cin>>a>>b>>r; if(a>=2*r&&b>=2*r)cout<<"First"<<endl; else cout<<"Second"<<endl; return 0; } /********************* *********************/
B题,数学题,模拟一下就好了,注意符号一定要在第一个位置,刚开始用gcd负号在第二个数那里了wa了一发

#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-12; const int N=100000+10,maxn=500+100,inf=0x3f3f3f; int gcd(int a,int b) { return b ? gcd(b,a%b):a; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n,m,a,b,a1,b1; cin>>n>>m; for(int i=0;i<=n;i++) { cin>>a; if(i==0)a1=a; } for(int i=0;i<=m;i++) { cin>>b; if(i==0)b1=b; } if(n>m) { if(a1*b1>0)cout<<"Infinity"<<endl; else cout<<"-Infinity"<<endl; } else if(n<m)cout<<"0/1"<<endl; else { int x=gcd(a1,b1); a1/=x;b1/=x; if(a1*b1<0)cout<<"-"<<abs(a1)<<"/"<<abs(b1)<<endl; else cout<<abs(a1)<<"/"<<abs(b1)<<endl; } return 0; } /********************* *********************/
C题才是最水的题。。。搞一个记录最大的数组从后往前扫一边就出来了

#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-12; const int N=100000+10,maxn=500+100,inf=0x3f3f3f; int maxx[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); string s; cin>>s; maxx[s.size()]=0; for(int i=s.size()-1;i>=0;i--) maxx[i]=max(maxx[i+1],s[i]-'0'); string ans=""; for(int i=0;i<s.size();i++) { if(maxx[i]==s[i]-'0')ans+=s[i]; } cout<<ans<<endl; return 0; } /********************* *********************/
D题,dfs,如果一个点能从两个方向到达的话,那就输出yes,用一个数组记录到达的位置

#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=1500+10,maxn=500+100,inf=0x3f3f3f; char ma[N][N]; int dx[4]= {1,0,-1,0}; int dy[4]= {0,1,0,-1}; bool vis[N][N]; int n,m,sx,sy; pair<int,int>v[N][N]; bool ok(int x,int y) { if(ma[x][y]=='.'&&!vis[x][y])return 1; return 0; } void dfs(int x,int y) { int fx=x,fy=y; while(fx<0)fx+=n; fx%=n; while(fy<0)fy+=m; fy%=m; if(vis[fx][fy]&&(v[fx][fy].first!=x||v[fx][fy].second!=y)) { cout<<"Yes"<<endl; exit(0); } if(!ok(fx,fy))return ; vis[fx][fy]=1; v[fx][fy]=make_pair(x,y); for(int i=0;i<4;i++) dfs(x+dx[i],y+dy[i]); } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>ma[i][j]; if(ma[i][j]=='S') { sx=i; sy=j; ma[i][j]='.'; } } } memset(vis,0,sizeof vis); dfs(sx,sy); cout<<"No"<<endl; return 0; } /********************* 5 5 ##.## #..## ..### .#S.. ##.## *********************/
E题,计算几何,极角排序,先dfs一遍预处理出每个节点有多少子节点,然后dfs一遍,每个区间进行极角排序(刚开始以为只需要一遍极角排序就行了,后来

#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-12; const int N=2000+10,maxn=500+100,inf=0x3f3f3f; struct point { double x,y; int id; }p[N]; point p0; vector<int>v[N]; int sz[N],ans[N]; bool comp(point p1,point p2) { double te=(p2.x-p0.x)*(p1.y-p0.y)-(p2.y-p0.y)*(p1.x-p0.x); if(te<0)return 1; return 0; } void dfs(int u,int fa) { sz[u]=1; for(int i=0;i<v[u].size();i++) if(v[u][i]!=fa) { dfs(v[u][i],u); sz[u]+=sz[v[u][i]]; } } void dfssort(int u,int fa,int be,int en) { for(int i=be;i<en;i++) if(p[i].x<p[be].x||(p[i].x==p[be].x&&p[i].y<p[be].y)) swap(p[i],p[be]); p0=p[be]; ans[p[be].id]=u; sort(p+be+1,p+en,comp); int te=be; for(int i=0; i<v[u].size(); i++) { if(v[u][i]!=fa) { dfssort(v[u][i],u,te+1,te+sz[v[u][i]]+1); te+=sz[v[u][i]]; } } } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int i=1;i<n;i++) { int a,b; cin>>a>>b; v[a].push_back(b); v[b].push_back(a); } for(int i=0;i<n;i++) { cin>>p[i].x>>p[i].y; p[i].id=i+1; } dfs(1,-1); // for(int i=1;i<=n;i++)cout<<sz[i]<<endl; dfssort(1,-1,0,n); for(int i=1;i<=n;i++)cout<<ans[i]<<" "; cout<<endl; return 0; } /********************* 3 1 3 2 3 0 0 1 1 2 0 *********************/
发现这样子节点可能会坐标倒回来,有可能相交)