傳說fans是一個數學天才。在他五歲那年,從一堆數字卡片中選出了4張 卡片:5,7,6,8。這4個數字有什麼神祕之處呢?若是把這4張卡片自左往右的排成:5,6,7,8。你就會發現:原來這4個數字構成了等差數列!當年 fans選出了n組卡片,聽說都可以構成等差數列。可是事實真的是這樣嗎?fans真的有這麼神奇嗎? n組數據就是fans選出的n組卡片,請你判斷每一組卡片是否能構成等差數列.php
傳說fans是一個數學天才。在他五歲那年,從一堆數字卡片中選出了4張 卡片:5,7,6,8。這4個數字有什麼神祕之處呢?若是把這4張卡片自左往右的排成:5,6,7,8。你就會發現:原來這4個數字構成了等差數列!當年 fans選出了n組卡片,聽說都可以構成等差數列。可是事實真的是這樣嗎?fans真的有這麼神奇嗎? n組數據就是fans選出的n組卡片,請你判斷每一組卡片是否能構成等差數列.php
第一個數爲數據的組數n,表示後面有n行,每行中的第一個數爲該組數據的元素個數m(1≤m≤100),其後是m個正整數(不會超出int的表示範圍)。html
若是可以構成等差數列,輸出「yes」,不然輸出「no」。ios
1 #include <iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int n,t; 6 int a[110]; 7 int main() 8 { 9 scanf("%d", &t); 10 while(t--) 11 { 12 scanf("%d", &n); 13 for (int i=0; i<n; i++) 14 scanf("%d",&a[i]); 15 sort(a,a+n); 16 if (n<=2) 17 { 18 printf("yes\n"); 19 continue; 20 } 21 int flag=1; 22 for(int i=1; i<n-1; i++) 23 { 24 if((a[i+1]-a[i])!=(a[1]-a[0])) 25 { 26 flag=0; 27 break; 28 } 29 } 30 if (flag) 31 printf("yes\n"); 32 else 33 printf("no\n"); 34 } 35 return 0; 36 }
建議先把全部狀況都算出來^_^數組
題目大意:給你一個時間(年月日),你能夠將月份+1或將日+1,誰先達到2001.11.4誰贏了,若是你先操做,問你是否必贏。ide
分析:博弈論,找規律。打表找到的規律是若是(月份+日)爲偶數則必定贏,不然輸,但有兩組特殊數據即11月30與9月30,這兩組也爲贏。函數
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int t,y,m,d; 6 int main () 7 { 8 scanf("%d",&t); 9 while(t--) 10 { 11 scanf("%d%d%d",&y,&m,&d); 12 if (m==9&&d==30) 13 printf("YES\n"); 14 else if(m==11&&d==30) 15 printf("YES\n"); 16 else if((m+d)&1) 17 printf("NO\n"); 18 else 19 printf("YES\n"); 20 } 21 }
所有數據n< =50,m< =5測試
題目大意:上面說的很清楚了spa
分析:遞推,找規律。令f[i]表示i個電站的方案數,那麼f[i]=2*f[i-1]-f[i-m-1].net
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 long long s[60]; 6 int main () 7 { 8 int n,m; 9 while(scanf("%d%d",&n,&m)!=EOF) 10 { 11 s[4]=s[5]=1; 12 for(int i=6; i<=n+6; ++i) 13 { 14 s[i]=2*s[i-1]-s[i-m-1]; 15 } 16 printf("%lld\n",s[n+5]); 17 } 18 }
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define maxlen 30 5 using namespace std; 6 int f[maxlen][maxlen][maxlen]; 7 int main() 8 { 9 int a,b,c; 10 for (int i=0; i<=20; i++) 11 { 12 for (int j=0; j<=20; j++) 13 { 14 for (int k=0; k<=20; k++) 15 { 16 if ((i==0)||(j==0)||(k==0)) f[i][j][k]=1; 17 else if ((i<j)&&(j<k)) f[i][j][k]=f[i][j][k-1]+f[i][j-1][k-1]-f[i][j-1][k]; 18 else f[i][j][k]=f[i-1][j][k]+f[i-1][j-1][k]+f[i-1][j][k-1]-f[i-1][j-1][k-1]; 19 } 20 } 21 } 22 while (scanf("%d%d%d",&a,&b,&c)) 23 { 24 if(a==-1&&b==-1&&c==-1) 25 break; 26 if ((a<=0)||(b<=0)||(c<=0)) 27 printf("w(%d, %d, %d) = 1\n",a,b,c); 28 else if ((a>20)||(b>20)||(c>20)) 29 printf("w(%d, %d, %d) = %d\n",a,b,c,f[20][20][20]); 30 else 31 printf("w(%d, %d, %d) = %d\n",a,b,c,f[a][b][c]); 32 } 33 return (0); 34 }
題目大意:給你三種距離對應的票價,而後給你n個站之間的距離,問你從站a->站b最少的費用是多少。code
分析:動態規劃。令dp[i]表示第a個站到第i個站的最小費用,那麼有三種狀況,即分別買三種車票(若是能夠)。。。
因此狀態轉移方程爲dp[i]=min{dp[j]+c1,dp[k]+c2,dp[l]+c3},j,k,l分別表示買相應車票可以到的最遠的車站編號。
這個程序有點小問題,TLE,可是卻過了。爲何能過呢?稍後解答
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #define maxlen 10010 6 #define INF 0x3fffffff 7 using namespace std; 8 long long dp[maxlen],dist[maxlen]; 9 int l1,l2,l3,c1,c2,c3; 10 int n,a,b; 11 int main () 12 { 13 while(scanf("%d%d%d%d%d%d",&l1,&l2,&l3,&c1,&c2,&c3)!=EOF) 14 { 15 scanf("%d",&n); 16 scanf("%d%d",&a,&b); 17 dist[1]=0; 18 for(int i=2;i<=n;++i) 19 scanf("%lld",&dist[i]); 20 for(int i=0;i<=n;++i) 21 dp[i]=INF; 22 dp[a]=0; 23 for(int i=a;i<=b;++i) 24 { 25 for(int j=a;j<=b;++j) 26 { 27 if(abs(dist[i]-dist[j])<=l1) 28 dp[i]=min(dp[i],dp[j]+c1); 29 else if(abs(dist[i]-dist[j]<=l2)) 30 dp[i]=min(dp[i],dp[j]+c2); 31 else if(abs(dist[i]-dist[j]<=l3)) 32 dp[i]=min(dp[i],dp[j]+c3); 33 } 34 } 35 printf("%lld\n",dp[b]); 36 } 37 }
爲何上面錯誤的代碼能過呢?由於測試數據只有一組!!!就只有樣例,因此下面的神級代碼也能夠過。=。=明天加數據rejudge吧。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int main () 5 { 6 printf("70\n"); 7 }
題目大意:給你n個數的水晶序列,問你能不能將這些水晶構成兩個高度相同的塔,若是能夠輸出最大的塔高。
分析:動態規劃,dp[i][j]表示第一座塔高i,第二座高j能不能達到,(1爲能夠,0爲不能夠)
那麼就是變形0-1揹包了,一個水晶能夠加入第一座塔,也能夠加入第二座,或者不加。枚舉每一個水晶,記錄每次可能的狀況,最後搜索最大的i使dp[i][i]=1就是答案,若是沒有則輸出Impossible。
注意點:初始化爲dp[0][0]=1,其他爲0,但最後若是有(0,0)的應該是輸出Impossible的。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #define maxlen 2100 6 #define INF 0x7fffff 7 using namespace std; 8 bool dp[maxlen][maxlen]; 9 int num[200]; 10 int n; 11 int main() 12 { 13 while(scanf("%d",&n)!=EOF) 14 { 15 memset(dp,0,sizeof(dp)); 16 for(int i=0; i<n; ++i) 17 scanf("%d",&num[i]); 18 dp[0][0]=true; 19 for(int i=0; i<n; ++i) 20 { 21 for(int j=1010; j>=0; --j) 22 { 23 for(int k=1010; k>=0; --k) 24 { 25 if(dp[j][k]==true) 26 { 27 if(j+num[i]<=1010) 28 dp[j+num[i]][k]=true; 29 if (k+num[i]<=1010) 30 dp[j][k+num[i]]=true; 31 } 32 } 33 } 34 } 35 int flag=0; 36 for(int i=1010; i>0; --i) 37 { 38 if(dp[i][i]==true) 39 { 40 flag=1; 41 printf("%d\n",i); 42 break; 43 } 44 } 45 if(!flag) 46 printf("Impossible\n"); 47 } 48 }
1 #include<iostream> 2 #include<cstdio> 3 #include <algorithm> 4 using namespace std; 5 int l,a[102],s,t,n; 6 int dp[3300000],d[3300000]; 7 int main() 8 { 9 scanf("%d%d%d%d",&l,&s,&t,&n); 10 for(int i=1; i<=n; ++i) 11 scanf("%d",&a[i]); 12 int num; 13 if(s==t) 14 { 15 num=0; 16 for(int i=1; i<=n; i++) 17 if(a[i]%s==0) num++; 18 printf("%d\n",num); 19 } 20 else 21 { 22 int tmp; 23 sort(a+1,a+n+1); 24 a[n+1]=l; 25 for(int i=1; i<=n; ++i) 26 { 27 if(a[i+1]-a[i]>100) 28 a[i+1]=a[i]+(a[i+1]-a[i])%100; 29 } 30 l=a[n+1]; 31 for(int i=1; i<=n; ++i) 32 d[a[i]]=1; 33 for(int i=1; i<=l+t; ++i) 34 dp[i]=0xFFFFFFF; 35 for(int i=s; i<=l+t; ++i) 36 { 37 for(int j=s; j<=t; ++j) 38 { 39 if(i>=j&&dp[i]>dp[i-j]+d[i]) 40 dp[i]=dp[i-j]+d[i]; 41 } 42 } 43 num=0xFFFFFFF; 44 for(int i=l; i<=l+t; ++i) 45 num=min(num,dp[i]); 46 printf("%d\n",num); 47 } 48 return 0; 49 }
如圖,A 點有一個過河卒,須要走到目標 B 點。卒行走規則:能夠向下、或者向右。同時在棋盤上的任一點有一個對方的馬(如上圖的C點),該馬所在的點和全部跳躍一步可達的點稱爲對方馬的控制點。例如上圖 C 點上的馬能夠控制 9 個點(圖中的P1,P2 … P8 和 C)。卒不能經過對方馬的控制點。
棋盤用座標表示,A 點(0,0)、B 點(n,m)(n,m 爲不超過 20 的整數,並由鍵盤輸入),一樣馬的位置座標是須要給出的(約定: C<>A,同時C<>B)。如今要求你計算出卒從 A 點可以到達 B 點的路徑的條數。
鍵盤輸入
B點的座標(n,m)以及對方馬的座標(X,Y){不用判錯}
屏幕輸出
一個整數(路徑的條數)。
題目大意:給你一個n*m個棋盤。卒只能向下或向右走,有一匹馬在(x,y)馬邊上(9個)的的位置不能走,問從(0,0)到(n,m)有多少種走法。
分析:動態規劃。令dp[i][j]表示(0,0)到(i,j)的路徑數,那麼方程就是dp[i][j]=dp[i-1][j]+dp[i][j-1]。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define maxlen 30 5 #define INF -100000 6 using namespace std; 7 long long dp[30][30],visited[30][30]; 8 int n,m,x,y; 9 int xx[]= {-2,-2,-1,-1, 1, 1, 2, 2}; 10 int yy[]= {-1, 1,-2, 2,-2, 2,-1, 1}; 11 int xxx[]={0,-1}; 12 int yyy[]={-1,0}; 13 int main () 14 { 15 while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF) 16 { 17 memset(dp,0,sizeof(dp)); 18 dp[0][0]=1; 19 memset(visited,0,sizeof(visited)); 20 visited[x][y]=visited[0][0]=1; 21 for(int i=0; i<8; ++i) 22 { 23 int nextx=x+xx[i]; 24 int nexty=y+yy[i]; 25 visited[nextx][nexty]=1; 26 } 27 for(int i=0; i<=n; ++i) 28 { 29 for(int j=0; j<=m; ++j) 30 { 31 for(int k=0;k<2;++k) 32 if(!visited[i][j]) 33 dp[i][j]+=dp[i+xxx[k]][j+yyy[k]]; 34 } 35 } 36 printf("%lld\n",dp[n][m]); 37 } 38 }