前一段时间刷了一些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);
}