HDU2019 数列有序!
来源:互联网 发布:矩阵测光模式 编辑:程序博客网 时间:2024/04/28 18:21
问题链接:HDU2019 数列有序!。入门训练题,用C语言编写程序。
问题简述:参见上述链接。
问题分析:也许对于本题,会考虑用插入排序来做,那就有点绕远了。只要做排序就有可能可能做数据交换,处理时间就长了。
可以考虑输入的n个数据先存放在数组中,再输出。
各种方案中,一边输入数据,一边输出数据,并且在适当位置输出m的做法,应该是优选方案。因为这样做,省去了数组,没有使用额外空间。
程序说明:(略)。
AC的C语言程序如下(正解):
/* HDU2019 数列有序! */#include <stdio.h>int main(void){ int n, m, val, i; while(scanf("%d%d", &n, &m) != EOF) { if(n == 0 && m == 0) break; if(n == 0) { // n=0时,只需要输出m printf("%d\n", m); } else { // 读入n个数据,同时输出数据,并且在适当位置输出m int flag = 1; for(i=0; i<n; i++) { scanf("%d", &val); if(flag && val >= m) { if(i == 0) printf("%d", m); else printf(" %d", m); flag = 0; } if(i>0 || !flag) printf(" "); printf("%d", val); } printf("\n"); } } return 0;}
方案2:输入数据放到数组中,同时计数小于m的数据个数p,根据p值输出时在适当位置输出m。
AC的C语言程序如下:
/* HDU2019 数列有序! */#include <stdio.h>int main(void){ int n, m, a[100+1], i; while(scanf("%d%d", &n, &m) != EOF) { if(n == 0 && m == 0) break; if(n == 0) { // n=0时,只需要输出m printf("%d\n", m); } else { // 读入n个数据 int p = 0; for(i=0; i<n; i++) { scanf("%d", &a[i]); if(a[i] < m) p++; } // 输出结果 for(i=0; i<n; i++) { if(i == p) { if(i > 0) printf(" "); printf("%d", m); } if(i > 0 || i >= p) printf(" "); printf("%d", a[i]); } if(p == n) { printf(" %d\n", m); } else printf("\n"); } } return 0;}
方案3:输入数据时,将m与输入数据一起放入数组中,然后一起输出。这个方案的特点是输出部分逻辑相对简单。
AC的C语言程序如下:
/* HDU2019 数列有序! */#include <stdio.h>int main(void){ int n, m, a[100+1], i, j; while(scanf("%d%d", &n, &m) != EOF) { if(n == 0 && m == 0) break; if(n == 0) { // n=0时,只需要输出m printf("%d\n", m); } else { // 读入n个数据到数组a,并且将m插入到a的适当位置 int flag = 1; for(i=0,j=0; i<n; i++,j++) { scanf("%d", &a[j]); if(flag && a[j] > m) { a[j+1] = a[j]; a[j] = m; j++; flag = 0; } } if(i == j) // m还没有插入到数组a中,则放在最后 a[n] = m; // 输出结果 for(i=0; i<=n; i++) { if(i > 0) printf(" "); printf("%d", a[i]); } printf("\n"); } } return 0;}
方案4:先输入数据到数组中,然后用二分查找法找出m应该在的位置,然后输出结果。该方案逻辑太复杂,但是其逻辑也许有参考价值。
AC的C语言程序如下:
/* HDU2019 数列有序! */#include <stdio.h>int main(void){ int n, m, a[100+1], p, start, end, i; while(scanf("%d%d", &n, &m) != EOF) { if(n == 0 && m == 0) break; if(n == 0) { // n=0时,只需要输出m printf("%d\n", m); } else { // 读入n个数据 for(i=0; i<n; i++) scanf("%d", &a[i]); // 用二分法找出m在a中的位置p,即满足a[p-1]<=m并且m<=a[p] // 需要考虑到特殊情况,即m在最前面(第1个)和m在最后面(第n个)的情况 // 找到m在a中的位置后,不必将m插入到a中,只需要输出时在合适位置输出即可 start = 0; end = n - 1; p = 0; while(start < end) { p = (start + end) / 2; if(a[p] == m) break; else if(a[p] < m) start = ++p; // 关键:改变start值的同时,要改变p值 else if(a[p] > m) end = --p; // 关键:改变end值的同时,要改变p值 } if(a[p] < m) // 关键:最后的调整 p++; } // 输出结果 for(i=0; i<n; i++) { if(i == p) { if(i > 0) printf(" "); printf("%d", m); } if(i > 0 || i >= p) printf(" "); printf("%d", a[i]); } if(p == n) { printf(" %d\n", m); } else printf("\n"); } return 0;}
1 0
- hdu2019 数列有序!
- hdu2019 数列有序!
- hdu2019 数列有序!
- HDU2019 数列有序!
- hdu2019 数列有序
- HDU2019 数列有序!
- HDU2019--数列有序!
- Hdu2019 数列有序!
- HDU2019-数列有序!
- HDU2019数列有序
- HDU2019数列有序!
- hdu2019——数列有序解题报告
- (解题报告)HDU2019---数列有序!
- HDU2019
- HDU2019
- HDU2019
- HDU2019
- 数列有序!
- javascript 字符串分割split()
- 诗娜小说网推书【重生之金色婚姻】
- javascript 提取字符串substring()
- javascript 提取指定数目的字符substr()
- javascript 随机数 random()
- HDU2019 数列有序!
- javascript 指定分隔符连接数组元素join()
- oracle大数据表(千万级)修改,删除优化技巧【转】
- git进阶教程之--rebase
- 你知道如何查看git的log吗?
- Hadoop集群化搭建(二)配置JAVA环境
- DB2命令(转)
- ajax分页
- android(base)面试题