T1 终于结束的起点
题解:枚举啊...
斐波那契数 第46个爆int,第92个爆long long....
发现结果一般是m的几倍左右....不用担心T。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int M,N; int t,f1,f2; int main() { scanf("%d",&M);f1=1;f2=1; for(int i=3;i;i++) { t=(f1+f2)%M; f1=f2%M; f2=t; if(f1%M==0&&f2%M==1) { printf("%d ",i-1); break; } } return 0; }
T2跳跳!
题解:贪心。
从当前没跳过的最高的和最低的之间来回跳。
//预计10分 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; int n; int h[320],vis[320]; LL ans; void dfs(int now,int a,LL scor) { if(a==n) { ans=max(ans,scor); return ; } for(int i=1;i<=n;i++) { if(vis[i]) continue; vis[i]=true; dfs(i,a+1,scor+(h[now]-h[i])*(h[now]-h[i])); vis[i]=false; } } int main() { freopen("rand.txt","r",stdin); freopen("baoli.txt","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&h[i]); dfs(0,0,0); cout<<ans<<endl; return 0; }
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; int n; int L,R; int h[320]; LL ans; int main() { scanf("%d",&n);L=0;R=n; for(int i=1;i<=n;i++) scanf("%d",&h[i]); sort(h,h+n+1); while(L<R) { ans=ans+(h[R]-h[L])*(h[R]-h[L]); L++; ans=ans+(h[R]-h[L])*(h[R]-h[L]); R--; } cout<<ans<<endl; return 0; }
T3 抱歉没读懂题目
T4 不围棋
题解:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 605 using namespace std; int cnt,g,flag,n; int a[N][N],qx[N*N],qy[N*N],vis[N][N]; int h,t; int dx[4]={0,1,0,-1}, dy[4]={-1,0,1,0}; char b[N][N]; struct B { int x,y; }c[N*N]; bool canGo(int x,int y,int flag) { a[x][y]=(flag%2==0?1:-1); //先放上要走的棋子 memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(vis[i][j]||a[i][j]==0) continue; //***** h=1;t=0;int js=0; //扫描联通块 qx[++t]=i;qy[t]=j; while(h<=t) { int nowx=qx[h],nowy=qy[h];h++;vis[nowx][nowy]=true; for(int v=0;v<4;v++) //***** { int nxtx=nowx+dx[v],nxty=nowy+dy[v]; //遍历四周 if(nxtx<=0||nxty<=0||nxtx>n||nxty>n||vis[nxtx][nxty]) continue; //***** if(!a[nxtx][nxty]) js++; //存在气 if(a[nxtx][nxty]==a[nowx][nowy]) { qx[++t]=nxtx;qy[t]=nxty; //***** } } } // cout<<"--------------"<<endl; if(!js) //扫描的联通块没有气 { a[x][y]=0; //尝试失败 return false; } } } return true; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>b[i]; for(int j=1;j<=n;j++) { if(b[i][j-1]=='.') //若为空 { a[i][j]=0; c[++cnt].x=i;c[cnt].y=j; //标记空位 } if(b[i][j-1]=='X') a[i][j]=-1; //若为黑棋 -1 if(b[i][j-1]=='O') a[i][j]=1; //若为白棋 1 } } if(n==1){printf("-1 -1 ");return 0;} //棋盘只有一个空位,先手没法走 while(1) { flag++;g=0; //flag标记当前是黑棋还是白棋走 for(int i=1;i<=cnt;i++) //找一个能走的空位 { int xx,yy;xx=c[i].x;yy=c[i].y; if(a[xx][yy]) continue; if(canGo(xx,yy,flag)) { printf("%d %d ",xx,yy); g=true;a[xx][yy]=(flag%2==0?1:-1); break; } } if(!g) { printf("-1 -1 "); return 0; } } return 0; }