POJ 做题总结
2015-12-11 19:18
330 查看
前一段时间刷了一些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个列的和进行一维最大子段和的计算,并找出最大的值。
poj1064: 有点技巧的二分题。题意:给你n根线,现在要把这n根线切割成k根等长(设长为len)的线,问能切得的最长的len为多少。Runtime Error这个错误不一定是由于数组越界产生的,还可能是由于除数为0产生的。
注意由于编程语言里的实数类型是有精度的,所以,如果直接来二分,其边界条件可能会出现误差,调小了会超时,调大了会报错。所以我们这里乘100被转化为整数问题的二分。
poj1182: 并查集。A吃B,B吃C...主要的难处在于状态的建立。看的网上的大神的,当时从图书馆走出来想了会、算想通了。
简单总结一下。
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<cstdio> #include<cstring> 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<cstdio> #include<cstring> 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<cstdio> #include<cstring> 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); }
相关文章推荐
- 最优配餐
- layer绘制渐变色
- hdoj Big Number 1212 (大数取余) 水
- C++学习笔记(初级篇)——作用域与“extern”关键字
- Java字符编码根本原理
- [iOS]邮箱验证
- C++关联容器的一些细节
- ARC下会导致内存泄漏的情况
- Objective-c语言_面向对象(继承)
- C++入门(2):操作符和控制结构
- 命令行选项
- Ugly Number
- 低噪声APD偏置电路
- Android 获取播放视频的相关 内容,  分辨率, 方向,作者信息
- typedef定义函数类型
- 自己动手“敲”微软100题系列二
- 9-《电子入门趣谈》第一章_一切从单片机开始-1.3.6串口通信
- ArrayList实现借壳
- 互联网广告与计算广告学入门
- Navicat