Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
请教这个题的线性算法In Reply To:貌似有一种非常强的线性算法。。。 Posted by:jsoi2005 at 2005-04-07 21:36:07 我只想到了0(n^2)的: 1.先从前往后找出满足递增的情况下最后一个数最小是多少o(n^2),(条件1) 2.再从后往前推出以每个位置开始的项能满足条件1的情况,最大能是多少o(n^2) 3.在2的结果上从前往后推每个逗号的位置,每次让当前项尽量的大o(n^2) (当然如果您要说字符串比较也算是o(n)的话那就是o(n^3)了)- -| 付代码: #include<cstdio> #include<algorithm> #include<string.h> #include<iostream> #include<cmath> #include<vector> #include<fstream> #include<map> #include<list> #include<sstream> #include<queue> #include<set> using namespace std; string dp[81],s; char f[80]; char orz(const string &x,const string &y) { int lx=x.length(),ly=y.length(); if(lx>ly) return 1; else if(lx<ly) return -1; else { if(x>y) return 1; else if(x<y) return -1; else return 0; } } int main() { int l,ed2,ed1; while(cin>>s&&s!="0") { dp[0].clear(); dp[0]+=char(0); l=s.length(); for(int i=0;i<s.length();i++) { dp[i+1]=""; for(int j=i;j>=0;j--) { if(dp[j]=="") continue; int k=j; while(k<=i&&s[k]=='0') k++; if(k>i) k--; string tmp=s.substr(k,i-k+1); if(orz(dp[j],tmp)==-1) {dp[i+1]=tmp; break;} } } int ll=dp[l].length(); ed2=l-ll; dp[ed2]=dp[l]; ed1=ed2; while(ed1-1>=0&&s[ed1-1]=='0') dp[--ed1]=dp[l]; if(ed1==0) {cout<<s<<endl; continue;} for(int i=ed1-1;i>=0;i--) { dp[i]=""; for(int j=ed2;j>i;j--) { if(dp[j]=="") continue; int k=i; while(k<=j-1&&s[k]=='0') k++; if(k==j) k--; string tmp=s.substr(k,j-k); if(orz(tmp,dp[j])==-1) {dp[i]=tmp; break;} } } memset(f,0,l); int start=0; while(start<ed1) { for(int i=ed2-1;i>=start;i--) { if(dp[i+1]=="") continue; int k=start; while(k<=i&&s[k]=='0') k++; if(k>i) k--; string tmp=s.substr(k,i-k+1); if(orz(tmp,dp[i+1])==-1) {f[i+1]=1; start=i+1; break;} } } for(int i=0;i<l;i++) { if(f[i]) cout<<','; cout<<s[i]; } cout<<endl; } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator