POJ 2012金华邀请赛 (持续更新)(一)

2014-11-24 09:23:20 · 作者: · 浏览: 3

第一题,水题,但是题目读了很久,英语功底果然很差,主要是第二次排序的时候是按位排序,先按个位从小到大,然后是十位从小到大。题目描述太奇葩,这句话领会了很久。。
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);
}