SRM 546 div2
2012-06-17 18:07
351 查看
连续3场混迹div2了,还是绿的。。。
250pt
数据比较小,可以开个数组搞。。。大的话可以用map
550pt
数据比较小,可以直接暴搜1000*1000的格子判断。。。大的话就分情况讨论吧,感觉好复杂的样纸,还容易挂掉。。。
1000pt
这题跪了。。。开始想用DP,没怎么想清楚就开始乱搞了。。。。然后浪费了30min。。。
之后改成构造,把每一位前面的d1和d2个数记记下来,然后从最低位开始找,找到最低可以开始构造的位数i,然后再判断可行不(判断如果后i位全取最大可以比N大么),如果不行,就把i的前一位+1,然后再重复操作即可,知道找到答案
其实这题不难的,写完一直过不完sample,居然是拼写错误。。。跪跪跪
然后跪system test。。。注意前导0啊。。。
顺便ym跟我一个房间cha了3个人的大神。。。人家的代码我都看不懂怎么cha。。。
250pt
数据比较小,可以开个数组搞。。。大的话可以用map
550pt
数据比较小,可以直接暴搜1000*1000的格子判断。。。大的话就分情况讨论吧,感觉好复杂的样纸,还容易挂掉。。。
1000pt
这题跪了。。。开始想用DP,没怎么想清楚就开始乱搞了。。。。然后浪费了30min。。。
之后改成构造,把每一位前面的d1和d2个数记记下来,然后从最低位开始找,找到最低可以开始构造的位数i,然后再判断可行不(判断如果后i位全取最大可以比N大么),如果不行,就把i的前一位+1,然后再重复操作即可,知道找到答案
其实这题不难的,写完一直过不完sample,居然是拼写错误。。。跪跪跪
然后跪system test。。。注意前导0啊。。。
//1000pt的代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<set> #include<map> #include<vector> #define ll long long using namespace std; int cc1[20],cc2[20],tot=0; ll a[25],b[1000000]; void cal(ll x,int tc1,int tc2,int d1,int d2) { //cout<<x<<" "<<tc1<<" "<<tc2<<" "<<d1<<" "<<d2<<endl; if((tc1==0)&&(tc2==0)){b[++tot]=x;return;} if(tc1>0)if(d1!=0||d1==0&&x!=0)cal(x*10+d1,tc1-1,tc2,d1,d2); //前导0要除掉啊。。。 if(tc2>0)cal(x*10+d2,tc1,tc2-1,d1,d2); } ll find(ll N,ll M,int tc1,int tc2,int d1,int d2) { cal(0,tc1,tc2,d1,d2); int i,k=tc1+tc2; //for(i=1;i<=tot;i++)cout<<b[i]<<endl; for(i=1;i<=tot;i++) if(N/a[k]*a[k]+b[i]>M)break; return N/a[k]*a[k]+b[i]; } class FavouriteDigits { public: long long findNext(long long N,int d1,int c1,int d2,int c2) { ll temp,k,M=N; if(d1>d2){swap(d1,d2);swap(c1,c2);} int len,i,j,x; a[0]=1; for(i=1;i<=18;i++)a[i]=a[i-1]*10; while(1) { len=1; temp=N/10; while(temp){len++;temp/=10;} cc1[len]=cc2[len]=0; for(i=len-1;i>=0;i--) { x=N/a[i]%10; cc1[i]=cc1[i+1]; cc2[i]=cc2[i+1]; //开始直接写成cc2[1],WA了好久,囧 if(x==d1)cc1[i]++; if(x==d2)cc2[i]++; } if(cc1[0]>=c1&&cc2[0]>=c2)return N; int tc1,tc2; for(i=1;i<=len;i++) { if(cc1[i]>=c1)tc1=0; else tc1=c1-cc1[i]; if(cc2[i]>=c2)tc2=0; else tc2=c2-cc2[i]; if(tc1+tc2>i)continue; //cout<<i<<endl; k=0; for(j=1;j<=tc2;j++)k=k*10+d2; for(j=1;j<=tc1;j++)k=k*10+d1; if(N/a[i]*a[i]+k<M)break; //cout<<N<<endl; return find(N,M,tc1,tc2,d1,d2); } if(i>len)i=len; N=(N/a[i]+1)*a[i]; } return -1; } };
顺便ym跟我一个房间cha了3个人的大神。。。人家的代码我都看不懂怎么cha。。。
相关文章推荐
- TopCode SRM 546: StrllRec_字符字典序剪枝
- srm 552 div2
- SRM 546 div2
- KleofasTail(SRM546-div1-1)
- SRM 628 DIV2
- TwoRectangles(SRM546-div2-2)
- SRM 585 DIV2
- 【TopCoder】SRM152 DIV2总结
- FavouriteDigits(SRM546-div1-2-div2-3)
- SRM 574 250 DIV2
- 【Topcoder】SRM158 DIV2总结
- topcoder 记录 srm 144 div2
- srm 546
- SRM-697-DIV2
- TC SRM 548 DIV2
- SRM 554 div2
- SRM 513 div2
- SRM 548 DIV2
- SRM 504.5 DIV2
- SRM 667 DIV2 OrderOfOperationsDiv2 500-point