题目+数据:链接:http://pan.baidu.com/s/1hssN8GG 密码:bjw8
总结:
总分:300分,仅仅拿了120份。
这次所犯的失误:对于2,3题目,我刚刚看就想到了正确思路,急于敲正确思路,而没有去骗基础得分。
结果第二题DP打残了,第三题排列组合漏了一个小点没考虑到,都是仅仅拿了10分。
T1:
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子串相同都用到了辅助数组。
哎╮(╯▽╰)╭圆形操场不是成环考虑的。
说明:测试数据中有两组是有问题的,就是当出现偶数组合并不了的时候,是输出了最大值。而zhx大牛的最大值是1e9,因人而异吧。
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:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 typedef long long ll; 5 #define rep(i,a,n) for(int i=a;i<=n;i++) 6 ll pp=1000000007; 7 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;} 8 ll powmod(ll a,ll b,ll pp) 9 {ll ans=1; 10 for(;b;b>>=1,a=mo(a*a,pp)) 11 if(b&1)ans=mo(ans*a,pp); 12 return ans;} 13 ll gcd(ll a,ll b){return (!b)?a:gcd(b,a%b);} 14 ll read(){ 15 ll ans=0; 16 char last=‘ ‘,ch=getchar(); 17 while(ch<‘0‘ || ch>‘9‘)last=ch,ch=getchar(); 18 while(ch>=‘0‘ && ch<=‘9‘)ans=ans*10+ch-‘0‘,ch=getchar(); 19 if(last==‘-‘)ans=-ans; 20 return ans; 21 } 22 int n,m,p1[110000],p2[110000]; 23 ll b[110000],inv[110000]; 24 ll C(int n,int m){ 25 if(n<m || n==0)return 0; 26 return b[n]*inv[n-m]%pp*inv[m]%pp; 27 } 28 int main(){ 29 freopen("problem.in","r",stdin); 30 freopen("problem.out","w",stdout); 31 n=read();m=read(); 32 b[0]=1; 33 rep(i,1,n)b[i]=b[i-1]*i%pp; 34 rep(i,0,n)inv[i]=powmod(b[i],pp-2,pp); 35 36 rep(i,1,m){ 37 int x=read(),y=read(); 38 if(x==y){ 39 puts("0\n"); 40 return 0; 41 } 42 p1[x]=1; 43 p2[y]=1; 44 } 45 ll ans=b[n-m]; 46 // cout<<ans<<endl; 47 int s=0; 48 rep(i,1,n) 49 if(!p1[i] && !p2[i])++s; 50 rep(i,1,s) 51 if(i&1)ans=mo(ans-C(s,i)*b[n-m-i],pp); 52 else ans=mo(ans+C(s,i)*b[n-m-i],pp); 53 cout<<ans<<endl; 54 return 0; 55 }
时间: 2024-10-13 08:47:40