C语言(31)变态最大值
2018-03-12 11:24
162 查看
描述Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这么烂,幸好在他的帮助下大家算是解决了这个问题,但是问题又来了。他想在一组数中找一个数,这个数可以不是这组数中的最大的,但是要是相对比较大的,但是满足这个条件的数太多了,怎么办呢?他想到了一个办法,把这一组数从开始把每相邻三个数分成一组(组数是从1开始),奇数组的求最大值,偶数组的求最小值,然后找出这些值中的最大值。输入有多组测试数据,以文件结束符为标志。
每组测试数据首先一个N,是数组中数的个数。(0<N<10000,为降低题目难度,N是3的倍数)
然后是数组中的这些数。输出输出包括一行,就是其中的最大值。样例输入
#include <string.h>
#define MAX(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)
#define MIN(a,b,c) ((a>b?b:a)>c?c:(a>b?b:a))
int main(int argc, char **argv)
{
int n, i, flag, a, b, c;
int buffer[10000]={0};
while(~scanf("%d", &n)){
bzero(buffer, sizeof(buffer));
getchar();
flag = 0;
for(i=0; i<n; i++){
scanf("%d", &buffer[i]);
}
buffer[i] = -2147483648;
//n /= 3;
while(n >= 1){
flag = 0;
for(i = 0; i < n/3; i++){
if(0 == flag){
buffer[i] = MAX(buffer[3*i],buffer[3*i+1],buffer[3*i+2]);
}else{
buffer[i] = MIN(buffer[3*i],buffer[3*i+1],buffer[3*i+2]);
}
flag = 1 - flag;
//printf("%d ", buffer[i]);
}
if(-2147483648 != buffer[3*i] && -2147483648 != buffer[3*i+1]){
if(0 == flag){
buffer[i] = buffer[3*i]>buffer[3*i+1]?buffer[3*i]:buffer[3*i+1];
}else{
buffer[i] = buffer[3*i]<buffer[3*i+1]?buffer[3*i]:buffer[3*i+1];
}
buffer[i+1] = -2147483648;
//printf("%d ", buffer[i]);
}else if(-2147483648 != buffer[3*i]){
buffer[i] = buffer[3*i];
buffer[i+1] = -2147483648;
//printf("%d ", buffer[i]);
}else{
buffer[i] = -2147483648;
}
n /= 3;
}
printf("%d\n", buffer[0]);
}
return 0;
}二、AC程序#include <stdio.h>
#include <string.h>
#define MAX(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)
#define MIN(a,b,c) ((a>b?b:a)>c?c:(a>b?b:a))
int main(int argc, char **argv)
{
int n, i, flag, a, b, c, max, tmp;
while(~scanf("%d", &n)){
getchar();
flag = 0;
max = -2147483648;
for(i=0; i<n/3; i++){
scanf("%d%d%d", &a, &b, &c);
if(flag == 0){
tmp = MAX(a,b,c);
}else{
tmp = MIN(a,b,c);
}
max = max>tmp?max:tmp;
flag = 1 - flag;
}
#if 0
//当n%3!=0时的解决办法
if(1 == n%3){
scanf("%d", &tmp);
max = max>tmp?max:tmp;
}else if(2 == n%3){
scanf("%d%d", &a, &b);
if(flag == 0){
tmp = a>b?a:b;
}else{
tmp = a<b?a:b;
}
max = max>tmp?max:tmp;
}
#endif
printf("%d\n", max);
}
return 0;
}
每组测试数据首先一个N,是数组中数的个数。(0<N<10000,为降低题目难度,N是3的倍数)
然后是数组中的这些数。输出输出包括一行,就是其中的最大值。样例输入
3 4 5 6 6 1 2 3 7 9 5样例输出
6 5
刚开始理解题意错误:
从开始把每相邻三个数分成一组(组数是从1开始),奇数组的求最大值,偶数组的求最小值,然后找出这些值中的最大值。
理解成了按上述规律求出最终值一、错误程序#include <stdio.h>
#include <string.h>
#define MAX(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)
#define MIN(a,b,c) ((a>b?b:a)>c?c:(a>b?b:a))
int main(int argc, char **argv)
{
int n, i, flag, a, b, c;
int buffer[10000]={0};
while(~scanf("%d", &n)){
bzero(buffer, sizeof(buffer));
getchar();
flag = 0;
for(i=0; i<n; i++){
scanf("%d", &buffer[i]);
}
buffer[i] = -2147483648;
//n /= 3;
while(n >= 1){
flag = 0;
for(i = 0; i < n/3; i++){
if(0 == flag){
buffer[i] = MAX(buffer[3*i],buffer[3*i+1],buffer[3*i+2]);
}else{
buffer[i] = MIN(buffer[3*i],buffer[3*i+1],buffer[3*i+2]);
}
flag = 1 - flag;
//printf("%d ", buffer[i]);
}
if(-2147483648 != buffer[3*i] && -2147483648 != buffer[3*i+1]){
if(0 == flag){
buffer[i] = buffer[3*i]>buffer[3*i+1]?buffer[3*i]:buffer[3*i+1];
}else{
buffer[i] = buffer[3*i]<buffer[3*i+1]?buffer[3*i]:buffer[3*i+1];
}
buffer[i+1] = -2147483648;
//printf("%d ", buffer[i]);
}else if(-2147483648 != buffer[3*i]){
buffer[i] = buffer[3*i];
buffer[i+1] = -2147483648;
//printf("%d ", buffer[i]);
}else{
buffer[i] = -2147483648;
}
n /= 3;
}
printf("%d\n", buffer[0]);
}
return 0;
}二、AC程序#include <stdio.h>
#include <string.h>
#define MAX(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)
#define MIN(a,b,c) ((a>b?b:a)>c?c:(a>b?b:a))
int main(int argc, char **argv)
{
int n, i, flag, a, b, c, max, tmp;
while(~scanf("%d", &n)){
getchar();
flag = 0;
max = -2147483648;
for(i=0; i<n/3; i++){
scanf("%d%d%d", &a, &b, &c);
if(flag == 0){
tmp = MAX(a,b,c);
}else{
tmp = MIN(a,b,c);
}
max = max>tmp?max:tmp;
flag = 1 - flag;
}
#if 0
//当n%3!=0时的解决办法
if(1 == n%3){
scanf("%d", &tmp);
max = max>tmp?max:tmp;
}else if(2 == n%3){
scanf("%d%d", &a, &b);
if(flag == 0){
tmp = a>b?a:b;
}else{
tmp = a<b?a:b;
}
max = max>tmp?max:tmp;
}
#endif
printf("%d\n", max);
}
return 0;
}
相关文章推荐
- 6个变态的C语言HELLO WORLD程序
- 变态最大值
- 剑指Offer----面试题31:连续子数组的最大和
- 【c语言】不用大与小与号,求两数最大值
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 6个变态的C语言写的Hello World【转】
- C语言初步-第7讲:分支结构体验(三数最大数)
- C语言进阶之路------函数调用之辗转相除法求两个数的最小公倍数和最大公约数
- 【C语言】打印1到最大的n位数
- 最大熵阈值分割算法的C语言实现
- C语言实现数组中查找最大值、最小值和第二大值
- 31.连续子数组的最大和
- 6个变态的C语言Hello World程序
- C语言之指针专题二:指针做函数参数是指针存在的最大意义
- C语言练习篇-5二维数组行列交换及找最大值
- 变态最大值
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- C语言计算两个正整数的最大公约数与最大公倍数
- 变态最大值
- 【C语言】求10个数中最大值。