POJ 做题总结

    前一段时间刷了一些poj上的题,主要是找找手感。没有具体地做题方向。有些题是模仿着网上的大神写的。

    简单总结一下。

   poj1001:a+b  不贴代码了

   poj1003:水题,注意用scanf读入double时用%lf,读入float用%f

   poj1004:水题,与1003类似,while (scanf("%f",&x)!=EOF);x 是float

   poj1050:简单DP。二维最大子矩阵和。在一维情况下最大连续子段和的求法是从左到有顺序扫描数据,以0为边界,当累加和小于0时则重置为0.动态规划的状态转移方程为s=max{si-1+ai,ai},该方程和前面的描述是等价的。本题是对一维最大子段和的扩展,思路是从上到下找出所有的连续行(如第i行到第j行),然后计算每列从第i行到第j行的和,之后对这n个列的和进行一维最大子段和的计算,并找出最大的值。

#include
#include
using namespace std;
int i,j,k,m,n,p,q,x,ans,sum,a[110][110],c[110];
int main()
{
  scanf("%d",&n);
  m=1;
  p=1;
  q=1;
  while (m<=n*n)
  {
    scanf("%d",&x);
    a[p][q]=x;
    if (q==n)
    {
      p++;
      q=1;
	}
	else q++;
	m++; 
  }
  
  ans=-10000000;
  for (i=1;i<=n;i++)//从第i行开始 ,第j列的i->k的和 
  {
  	memset(c,0,sizeof(c));
    for (k=i;k<=n;k++)
    {
      for (j=1;j<=n;j++)
      c[j]+=a[k][j];
      
      sum=0;
      for (j=1;j<=n;j++)
      {
        if (sum>0) sum+=c[j];//相当于把子矩阵多行压缩为一行了
        else sum=c[j];
	    if (sum>ans) ans=sum;
	  }
	}
  }
  
  printf("%d\n",ans);
  return 0;
}
      poj1064: 有点技巧的二分题。 题意:给你n根线,现在要把这n根线切割成k根等长(设长为len)的线,问能切得的最长的len为多少。Runtime Error这个错误不一定是由于数组越界产生的,还可能是由于除数为0产生的。

             注意由于编程语言里的实数类型是有精度的,所以,如果直接来二分,其边界条件可能会出现误差,调小了会超时,调大了会报错。所以我们这里乘100被转化为整数问题的二分。

#include
#include
using namespace std;
#define maxn 10010
int tot,n,m,i,j,k;
int a[maxn],maxi,x,y;
float t;
int main()
{
  scanf("%d%d",&n,&k);
  maxi=0;
  for (i=1;i<=n;i++)
  {
    scanf("%f",&t);
    a[i]=t * 100;
    if (a[i]>maxi) maxi=a[i];
  }
  x=1;
  if (n>k) y=maxi;
  else y=maxi*n/k;

  
  int ans=0;
  while (y>=x)
  {
  	tot=0;
    t=(x+y)/2;
    for (int i=1;i<=n;i++)
    {
      tot+=(int)(a[i]/t);
      if (tot>=k) break;
    }
  
    if (tot>=k) 
	{ if (t>ans) ans=t; 
	  x=t+1;
    }
    else y=t-1;  
  }
  
  printf("%.2f\n",(double)ans/100.0);
  return 0;
}
       poj1182: 并查集。A吃B,B吃C...主要的难处在于状态的建立。看的网上的大神的,当时从图书馆走出来想了会、算想通了。

#include
#include
using namespace std;
int d,n,m,i,j,k,h,ans,fx,fy,x,y,f[50010],g[50010];
int find(int t)
{int temp;
	if (f[t]==t) return t;
	temp=f[t];
	f[t]=find(f[t]);
	g[t]=(g[temp]+g[t]) % 3;
    return f[t];
}
int main()
{
	freopen("1182.in","r",stdin);
	freopen("1182.out","w",stdout);
	
    scanf("%d%d\n",&n,&m);
    ans=0;
    for (i=0;i<=n-1;i++) { f[i]=i; g[i]=0; }
  	for (i=1;i<=m;i++)
    {
      scanf("%d %d %d\n",&d,&x,&y);
	  if (x>n || y>n || (d==2 && x==y)) { ans++; continue; }
	  fx=find(x);
	  fy=find(y);
	  if (fx!=fy)
	  {
	    f[fx]=fy;
		g[fx]=(g[y]-g[x]+2+d) % 3;
	  }
	  if (fx==fy)
	  {
	  	 if (g[x]!=((g[y]+d+2)%3)) ans++;
	  }
    }
    printf("%d\n",ans);
}


你可能感兴趣的:(POJ 做题总结)