第一题,水题,但是题目读了很久,英语功底果然很差,主要是第二次排序的时候是按位排序,先按个位从小到大,然后是十位从小到大。题目描述太奇葩,这句话领会了很久。。 POJ 4044 [cpp] #include #include #include #include #include #include #include #include #include #include #include #include #define PI acos(-1.0) #define Max 2005 #define inf 1<<28 #define LL(x) (x<<1) #define RR(x) (x<<1|1) #define FOR(i,s,t) for(int i=(s);i<=(t);++i) #define ll long long using namespace std; int a[50],b[50]; int v[200]; bool cmp(int a,int b) { return a>b; } bool cmp1(int a,int b) { if(a%10!=b%10)return (a%10)<(b%10); return (a/10)<(b/10); } int main() { int T; int n,m; cin>>T; while(T--) { cin>>n>>m; int t; memset(v,0,sizeof(v)); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); int num1=0; for(int i=0;i { cin>>t; if(!v[t]) { a[num1++]=t; v[t]=1; } } memset(v,0,sizeof(v)); int num2=0; for(int i=0;i { cin>>t; if(!v[t]) { v[t]=1; b[num2++]=t; } } sort(a,a+num1,cmp); sort(b,b+num2,cmp); int mm=0; int index=-1; int k; for(int i=0;i { for(int j=0;j { if(a[i]==b[j]) { for(k=1;k+i { if(a[i+k]!=b[j+k]) break; } if(mm { mm=k; index=i; } } } } int ans[105]; int ans1=0; if(!mm) { cout<<"NONE"< continue; } bool flag=0; for(int i=index;i { ans[ans1++]=a[i]; if(flag) cout<<" "; cout< flag=1; } cout< sort(ans,ans+ans1,cmp1); cout< for(int i=1;i cout<<" "< cout< } return 0; } /* 4 4 4 10 10 30 20 50 50 30 20 8 8 10 38 27 55 44 66 75 66 38 27 77 44 55 66 66 98 7 8 50 40 30 20 10 5 25 50 40 30 20 10 5 24 23 4 4 10 20 30 40 50 60 70 80 */ poj 4045 树形DP,下次写注释 [cpp] #include #include #include #include #include #include #include #include #include #include #include #include #define PI acos(-1.0) #define Max 2005 #define inf 1<<28 #define LL(x) (x<<1) #define RR(x) (x<<1|1) #define FOR(i,s,t) for(int i=(s);i<=(t);++i) #define ll long long using namespace std; int head[100005]; struct kdq { int u,v; int next; } edge[100005]; int num=0; int n; ll node[50005],dp[50005]; bool vis[50005]; void addedge(int u,int v) { edge[num].u=u; edge[num].v=v; edge[num].next=head[u]; head[u]=num++; } void dfs(int k) { vis[k]=1; dp[k]=0; node[k]=1; for(int i=head[k]; i!=-1; i=edge[i].next) { int v=edge[i].v; if(!vis[v]) { dfs(v); dp[k]=dp[k]+dp[v]+node[v]; node[k]+=node[v]; } } } void dfs1(int k) { vis[k]=1; for(int i=head[k]; i!=-1; i=edge[i].next) { int v=edge[i].v; if(!vis[v]) { dp[v]=dp[k]-2*node[v]+n; dfs1(v); }