題目+數據:連接:http://pan.baidu.com/s/1hssN8GG 密碼:bjw8
總結:ios
總分:300分,僅僅拿了120份。數組
此次所犯的失誤:對於2,3題目,我剛剛看就想到了正確思路,急於敲正確思路,而沒有去騙基礎得分。測試
結果第二題DP打殘了,第三題排列組合漏了一個小點沒考慮到,都是僅僅拿了10分。ui
T1:spa
1 /* 2 第一題比較容易,注意一些細節就能夠了。 3 好比刪除前導0不能刪沒了等等。 4 */ 5 #define N 1500 6 #include<iostream> 7 using namespace std; 8 #include<cstdio> 9 #include<cstring> 10 char a[N],b[N]; 11 int a1[N],b1[N],len; 12 void input() 13 { 14 scanf("%s%s",a+1,b+1); 15 len=strlen(a+1); 16 for(int i=1;i<=len;++i) 17 a1[i]=a[i]-'0'; 18 for(int i=1;i<=len;++i) 19 b1[i]=b[i]-'0'; 20 } 21 int main() 22 { 23 freopen("number.in","r",stdin); 24 freopen("number.out","w",stdout); 25 input(); 26 for(int i=1;i<=len;++i) 27 { 28 if(a1[i]>b1[i]) b1[i]=11; 29 if(a1[i]<b1[i]&&b1[i]!=11) a1[i]=11; 30 } 31 int ia=1,ib=1; 32 bool flag=false; 33 while(ia<len&&(a1[ia]==0||a1[ia]==11)) 34 { 35 if(a1[ia]==0) flag=true; 36 ia++; 37 } 38 if(a1[ia]==11) ia++; 39 if(ia>len&&(!flag)) printf("BOOM"); 40 else{ 41 for(int i=ia;i<=len;++i) 42 if(a1[i]!=11) printf("%d",a1[i]); 43 if(ia>len&&flag) printf("0"); 44 } 45 printf("\n"); 46 flag=false; 47 while(ib<len&&(b1[ib]==0||b1[ib]==11)) 48 { 49 if(b1[ia]==0) flag=true; 50 ib++; 51 } 52 if(b1[ib]==11) ib++; 53 if(ib>len&&(!flag)) printf("BOOM"); 54 else{ 55 for(int i=ib;i<=len;++i) 56 if(b1[i]!=11) printf("%d",b1[i]); 57 if(ib>len&&flag) printf("0"); 58 } 59 fclose(stdin); 60 fclose(stdout); 61 return 0; 62 }
T2:正確作法所用的技巧和NOIP2015Day2子串相同都用到了輔助數組。code
哎╮(╯▽╰)╭圓形操場不是成環考慮的。blog
說明:測試數據中有兩組是有問題的,就是當出現偶數組合並不了的時候,是輸出了最大值。而zhx大牛的最大值是1e9,因人而異吧。get
1 #define N 405 2 #include<iostream> 3 using namespace std; 4 #include<cstdio> 5 #include<cstring> 6 typedef long long ll; 7 int n,sum[N]; 8 ll f1[N][N],f2[N][N]; 9 void input() 10 { 11 scanf("%d",&n); 12 int x; 13 for(int i=1;i<=n;++i) 14 { 15 scanf("%d",&x); 16 sum[i]=sum[i-1]+x; 17 } 18 } 19 void DP() 20 { 21 for(int i=1;i<=n;++i) 22 for(int j=1;j<=n;++j) 23 f1[i][j]=f2[i][j]=(1<<31)-1; 24 for(int i=1;i<=n-1;++i) 25 f2[i][i+1]=sum[i+1]-sum[i-1]; 26 for(int i=1;i<=n;++i) 27 f1[i][i]=0; 28 for(int len=3;len<=n;++len) 29 for(int i=1;i+len-1<=n;++i) 30 { 31 int j=i+len-1; 32 for(int k=i;k<j;++k) f2[i][j]=min(f2[i][j],f1[i][k]+f1[k+1][j]+sum[j]-sum[i-1]); 33 for(int k=i;k<j;++k) f1[i][j]=min(f1[i][j],f2[i][k]+f1[k+1][j]+sum[j]-sum[k]); 34 /*注意這個推f1這個方程中,所加的代價是sum[j]-sum[k],由於i---k-1,這段石子的花費,咱們在推f2的時候已經加過了,因此不能重複加了*/ 35 } 36 } 37 int main() 38 { 39 freopen("merge.in","r",stdin); 40 freopen("merge.out","w",stdout); 41 input(); 42 DP(); 43 cout<<f1[1][n]<<endl; 44 fclose(stdin); 45 fclose(stdout); 46 return 0; 47 }
T3:input
1 #define N 100010 2 #include<iostream> 3 using namespace std; 4 #include<cstdio> 5 #define mod 1000000007 6 typedef long long ll; 7 int n,m,x,y; 8 bool p1[N],p2[N]; 9 ll jc[N],ny[N]; 10 ll quick_pow(ll a,ll b)//a^b 11 { 12 ll ans=1; 13 while(b) 14 { 15 if(b&1) 16 { 17 ans=(ans*a)%mod; 18 } 19 a=(a*a)%mod; 20 b>>=1; 21 } 22 return ans; 23 } 24 ll Mo(ll x)/*這裏定義了一個負數的取模方法,由於負數取模仍是負數,因此爲了預防結果輸出這種不合邏輯的答案,咱們須要進行以下處理*/ 25 { 26 if(x>=0&&x<mod) return x; 27 x%=mod; 28 if(x<0) x+=mod; 29 return x; 30 } 31 ll C(int n,int m) 32 { 33 if(m>n||m<0) return 0; 34 if(m==n||m==0) return 1; 35 return jc[n]*ny[m]%mod*ny[n-m]%mod; 36 } 37 int main() 38 { 39 freopen("problem.in","r",stdin); 40 freopen("problem.out","w",stdout); 41 scanf("%d%d",&n,&m); 42 for(int i=1;i<=m;++i) 43 { 44 scanf("%d%d",&x,&y); 45 if(x==y) 46 { 47 printf("0"); 48 return 0; 49 } 50 p1[x]=true;p2[y]=true; 51 } 52 int s=0; 53 for(int i=1;i<=n;++i) 54 { 55 if(!p1[i]&&!p2[i]) s++;/*統計能夠自由放的個數*/ 56 } 57 jc[0]=1; 58 for(int i=1;i<=n;++i) jc[i]=(jc[i-1]*i)%mod; 59 for(int i=0;i<=n;++i) ny[i]=quick_pow(jc[i],mod-2); 60 ll ans=jc[n-m]; 61 for(int i=1;i<=s;++i) 62 { 63 if(i&1) ans=Mo(ans-C(s,i)*jc[n-m-i]); 64 else ans=Mo(ans+C(s,i)*jc[n-m-i]); 65 } 66 cout<<ans<<endl; 67 fclose(stdin); 68 fclose(stdout); 69 return 0; 70 }