习题4-10 UVa815 Flooded!
2016-01-16 14:54
239 查看
快半个月没刷题了,一直在准备期末考试,终于考完了可以刷题了!思路很清晰的一道题,没有什么特别难的地方,但花的时间长了点。
要点:
先将海拔高度从小到大排列,如果要淹没一个格子,需要比它小的所有格子的雨水的海拔高度都达到这个格子的海拔高度,count=a[i]*(i-1)-sum{a[1],a[2]……a[i-1]}。这道题有很多种方法,我这种还行但我写的代码很难看,懒得简化了
代码如下:
网上这种方法很不错:
要点:
老规矩先排序,但思路跟我想到的不同,它是先算出这些雨水放进一些格子后算出这些格子的高度,这样直接算高度方便一些,重点设立一个循环记录格子数,雨水总量加上当前格子的高度以及小于当前值的格子的高度再除格子数可以算出这些格子内的雨水高度并和大一些的格子比较,如果小于等于说明成功了。
代码如下(简洁多了):
要点:
先将海拔高度从小到大排列,如果要淹没一个格子,需要比它小的所有格子的雨水的海拔高度都达到这个格子的海拔高度,count=a[i]*(i-1)-sum{a[1],a[2]……a[i-1]}。这道题有很多种方法,我这种还行但我写的代码很难看,懒得简化了
代码如下:
#include<stdio.h> #include<stdlib.h> int a[1000]; int cmp(const void *a, const void *b) { return *(int*)a - *(int*)b; } int main() { int m, n,i,j; double ans, per; int number = 1; while (scanf("%d%d", &m, &n),m+n) { int num; for (i = 1; i <= m; i++) for (j = 1; j <= n; j++) scanf("%d", &a[(i - 1)*n + j]);//为了方便排序将二维数组化为一维的 scanf("%d", &num); qsort(a+1, m*n, sizeof(a[0]), cmp); int sum,count; for (i = 2; i <= m*n; i++) { sum = 0; //注意sum一开始要赋值为0 for (j = 1; j < i; j++) sum += a[j]; count = a[i] * (i - 1) - sum; if(count*100>num) break; } i = i - 1; sum = 0; for (j = 1; j < i; j++) sum += a[j]; count = a[i] * (i - 1) - sum; ans = (double)(num - count * 100) / (i * 100) + a[i]; per = (double)i / (m*n); printf("Region %d\n", number++); printf("Water level is %.2lf meters.\n", ans); printf("%.2lf percent of the region is under water.\n", per*100); printf("\n"); } return 0; }
网上这种方法很不错:
要点:
老规矩先排序,但思路跟我想到的不同,它是先算出这些雨水放进一些格子后算出这些格子的高度,这样直接算高度方便一些,重点设立一个循环记录格子数,雨水总量加上当前格子的高度以及小于当前值的格子的高度再除格子数可以算出这些格子内的雨水高度并和大一些的格子比较,如果小于等于说明成功了。
代码如下(简洁多了):
#include<stdlib.h> const int inf = 0xffffff; int a[1000]; int cmp(const void *a, const void *b) { return *(int*)a - *(int*)b; } int main() { int m, n,i; double H, num, k; int cas = 1; while(scanf("%d%d",&m,&n),m+n) { n = n*m; for (i = 1; i <= n; i++) scanf("%d", &a[i]); //对scanf来说换行符和空格是一样的 a[n + 1] = inf;//另设一个最后的值方便后面循环比较脱出 scanf("%lf", &num); num /= 100.0; qsort(a + 1, n, sizeof(a[0]), cmp); for (i = 1; i <= n; i++) { num += a[i]; H = num / i; if (H <= a[i + 1]) { k = i; break; } } printf("Region %d\n", cas++); printf("Water level is %.2lf meters.\n", H); printf("%.2lf percent of the region is under water.\n", (double)k*100/n); printf("\n"); } return 0; }
相关文章推荐
- Codeforces educational round 5. E Sum of Remainders 数论 分块
- Win7下vmware虚拟网卡显示未识别的网络
- 开辟线程进行pc(ubuntu)和arduino串口通信的python程序
- 嵌入式数据库 SQLite 浅析
- ubuntu系统源码下载
- <九度 OJ>题目1112:拦截导弹
- Struts2数据传输的背后机制:ValueStack(值栈)
- MySQL通过localhost无法连接数据库的解决
- DOS命令批量删除文件及制作该命令的批处理命令详解
- filezilla server 有时连不上可以重启arm试试 server安装为手动 每次要点下start
- POJ2001 Shortest Prefixes(字典树)
- 数据同步aop
- 主流FPGA产品介绍与命名规则
- 关于Win7图标丢失、不正常显示的修复方法
- Max插件编写,为了提升工作效率,把工作中常用到的命令集成到一起了
- Fragment生命周期(在不同的方法分别能做什么操作)
- C++学习笔记
- 一些JavaScript题目
- CSS3旋转图片效果收集
- linux的export命令和profile,.bashrc,bash.profile各种环境变量文件