hdu1257+1232+1213
1257是一个dp问题,1232和1213则是两个并查集问题
1257
由题意可知,如果第i发导弹之前的导弹中有高度比第i发导弹低的导弹,那么所需的拦截系统的个数就要加一。设dp[i]表示前i发导弹所需要的拦截系统的个数。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<mem.h>
#include<math.h>
using namespace std;
int i,j,a[30005],dp[30005],n;
int main()
{
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
dp[i] = 1;
}
int ans = 0;
for(i=1;i<n;i++)
{
for(j=0;j<i;j++)
{
if(a[j]<a[i]) dp[i] = max(dp[i],dp[j]+1);
}
ans = max(ans,dp[i]);
}
printf("%d\n",ans);
}
return 0;
}
1232
这是一个并查集模板题,要注意的是G++和GCC里面有对rank字段的保留,因此不能定义rank作为数组名。代码中加入了路径压缩和rankf来代表每个树的深度,为的是使每次合并后的树不产生退化。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<mem.h>
#include<math.h>
using namespace std;
int father[1005],n,m,i,j,a,b,cnt;
int rankf[1005];
void init()
{
for(i=1;i<=n;i++)
{
father[i] = i;
rankf[i] = 1;
}
cnt = n;
}
int find(int x)
{
return father[x] = father[x] == x? x:find(father[x]);
}
void merge(int x, int y)
{
int a = find(x);
int b = find(y);
if(rankf[a] < rankf[b])
{
father[a] = b;
}
else
{
father[b] = a;
if(rankf[b] == rankf[a])
{
++rankf[a];
}
}
cnt--;
}
int main()
{
while(~scanf("%d",&n))
{
if(n==0) break;
scanf("%d",&m);
init();
if(m==0)
{
printf("%d\n",n-1);
continue;
}
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
int fa = find(a);
int fb = find(b);
if(fa == fb) continue;
merge(a,b);
}
printf("%d\n",cnt-1);
}
return 0;
}
1213
同样是一道并查集的模板题
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<mem.h>
#include<math.h>
using namespace std;
int father[1005],n,m,i,j,a,b,cnt,rankf[1005];
void init()
{
for(i=1;i<=n;i++)
{
father[i] = i;
rankf[i] = 1;
}
}
int find(int x)
{
return father[x] = father[x] == x? x:find(father[x]);
}
void merge(int x, int y)
{
int a = find(x);
int b = find(y);
if(rankf[a] < rankf[b])
{
father[a] = b;
}
else
{
father[b] = a;
if(rankf[b] == rankf[a])
{
++rankf[a];
}
}
cnt--;
}
int main()
{
int T,fa,fb;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
fa = find(a);
fb = find(b);
if(fa == fb) continue;
merge(a,b);
}
cnt = 0;
for(i=1;i<=n;i++)
{
if(father[i] == i) cnt++;
}
printf("%d\n",cnt);
}
return 0;
}