第三次训练赛题解
A.POJ-2255
理解二叉树就自然知道了
typedef struct tree
{
char data;
struct tree *l,*r;
} Tree;
Tree *creat(char a[],char b[],int n)
{
if(n==0)
return NULL;
Tree *t;
t=(Tree*)malloc(sizeof(Tree));
t->l=t->r=NULL;
t->data=a[0];
int i;
for(i=0;i<n;i++)
{
if(b[i]==a[0])
break;
}
t->l=creat(a+1,b,i);
t->r=creat(a+1+i,b+i+1,n-i-1);
return t;
}
void postorder(Tree* tree)
{
if(tree!=NULL)
{
postorder(tree->l);
postorder(tree->r);
printf("%c",tree->data);
}
}
int main()
{
char a[30],b[30];
while(~scanf("%s%s",a,b))
{
Tree *root;
root=(Tree*)malloc(sizeof(Tree));
root->l=root->r=NULL;
root=creat(a,b,strlen(a));
postorder(root);
printf("\n");
}
return 0;
} B.POJ-3268
先求x到各个点的最短路,所有牛去x可以把边反向然后求x到各个点的最短路,所以就是求两次x出发的最短路(矩阵转置),Floyd会超时,这里用的dijkstra。然后找个最大值即可
int n,m,x;
int edge[1005][1005],d[1005],v[1005];
void dijkstra()
{
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
d[i]=(i==x?0:edge[x][i]);
for(int i=1;i<=n;i++)
{
int minn=inf,p;
for(int j=1;j<=n;j++)
{
if(!v[j]&&d[j]<minn)
{
minn=d[j];
p=j;
}
}
v[p]=1;
for(int j=1;j<=n;j++)
if(!v[j])
d[j]=min(d[j],d[p]+edge[p][j]);
}
int ans=-1;
return ;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&x)!=EOF)
{
int from,to,w;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j) edge[i][j]=0;
else edge[i][j]=inf;
}
while(m--)
{
scanf("%d%d%d",&from,&to,&w);
edge[from][to]=w;
}
dijkstra();
int d1[1005];
for(int i=1;i<=n;i++)
d1[i]=d[i];
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
swap(edge[i][j],edge[j][i]);
}
dijkstra();
int ans=-1;
for(int i=1;i<=n;i++)
{
d1[i]+=d[i];
if(ans<d1[i])
ans=d1[i];
}
printf("%d\n",ans);
}
return 0;
} C.POJ-2524
并查集板题
int a[50010];
int ff(int x)
{
if(a[x]==x)
return x;
else
return a[x]=ff(a[x]);
}
int main()
{
int n,m,T=1;
while(~scanf("%d%d",&n,&m)&&(n!=0||m!=0))
{
for(int i=1;i<=n;i++)
a[i]=i;
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
a[max(ff(x),ff(y))]=min(ff(x),ff(y));
}
int ans=0;
for(int i=1;i<=n;i++)
if(a[i]==i)
ans++;
printf("Case %d: %d\n",T,ans);
T++;
}
return 0;
} D.POJ-3494
// #include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
typedef long long ll;
#define For(i,x,y) for(int i=x; i<(int)y; ++i)
#define mem(x,y) memset(x,y,sizeof(x))
#define ALL(a) a.begin(),a.end()
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define DOF 0x7f7f7f7f
#define se second
#define fi first
#define endl '\n'
// #pragma GCC optimize(2)
template <typename T>
inline void read(T &r){
static char c; r=0; int f=1;
for(c=getchar(); c<'0'||c>'9'; c=getchar()) if(c=='-')f=-1;
for(; c>='0'&&c<='9'; r=(r<<1)+(r<<3)+(c^48),c=getchar());
r*=f;
} // -_-
const int N=2e3+25;
int a[N][N]={0},dp[N][N]={0},n,m,h[N];
int f(int x){
For(i,0,m) h[i]=dp[x][i+1];
stack<int>sta;
int ans=0,l=0,len=m;
while(l<len){
if(sta.empty()||h[sta.top()]<=h[l]){
sta.push(l++);
}
else{
int mh=sta.top(); sta.pop();
int w =sta.empty()?l:l-sta.top()-1;
ans=max(ans,h[mh]*(w));
}
}
while(!sta.empty()){
int mh=sta.top(); sta.pop();
int w =sta.empty()?len:len-sta.top()-1;
ans=max(ans,h[mh]*(w));
}
return ans;
}
void solve(){
For(i,1,n+1){
For(j,1,m+1){
read(a[i][j]);
if(!a[i][j]) dp[i][j]=0;
else dp[i][j]=dp[i-1][j]+1;
}
}
int ans=0;
For(i,1,n+1){
ans=max(ans,f(i));
}
cout<<ans<<endl;
}
int main(){
int t;
while(cin>>n>>m)
solve();
// system("pause");
} E.POJ-3495
我印象中没有加这题,可能是误操作加进去的,想知道的自己百度吧,做出来了的跟我搜的代码一样ORZ
F.HDU-1556
前缀和
int ans[100007];
int main()
{
int n,sum,l,r;
while(cin>>n)
{
if(n==0) break;
sum=0;
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
{
cin >> l >> r;
ans[l]++; ans[r+1]--;
}
sum=ans[1];
cout << sum;
for(int i=2;i<=n;i++)
{
sum+=ans[i];
cout << " " << sum;
}
cout << endl;
}
return 0;
} G.CodeForces-1157A
签到题
int main()
{
int n;
cin>>n;
int s=0;
while(n>=10)
{
n++;
while(n%10==0)
{
n/=10;
}
s++;
}
cout<<s+9<<endl;
return 0;
} 
京公网安备 11010502036488号