T1 終於結束的起點ios
題解:枚舉啊...ide
斐波那契數 第46個爆int,第92個爆long long....spa
發現結果通常是m的幾倍左右....不用擔憂T。code
#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\n",i-1); break; } } return 0; }
題解:貪心。blog
從當前沒跳過的最高的和最低的之間來回跳。ci
//預計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 抱歉沒讀懂題目string
T4 不圍棋it
題解:io
#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\n");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\n",xx,yy); g=true;a[xx][yy]=(flag%2==0?1:-1); break; } } if(!g) { printf("-1 -1\n"); return 0; } } return 0; }