JZOI1169A 平均数Ave

NOI算法解析
本文介绍了一个用于解决特定信息学竞赛问题的算法实现。通过自定义输入读取函数提高效率,并利用归并排序进行数列排序及逆序对计数,以此来辅助查找满足条件的中位数,从而确定最优解。
#include <cstdio>
#include <cmath>
#define lztin() read()
#define ztyout( a ) printf( "%.4lf", a )
#define eps 1e-5
#define ll long long
using namespace std;
inline int read() {
    int x = 0,tmp = 1;char ch = getchar();
    while( ch < '0' || ch > '9' ) {if ( ch == '-' ) tmp = -1; ch = getchar();}
    while( ch >= '0' && ch <= '9'){x = x * 10 + ch - '0'; ch = getchar(); }
    return x * tmp;
}
int A[110000], N, K, cnt;
double B[1100000], T[1100000];
double ans;
void msort( int l, int r ) {
    if( l == r ) return;
    int mid = l + r >> 1;
    msort( l, mid ); 
    msort( mid + 1, r );
    int i = l, k = l, j = mid + 1;
    while( i <= mid && j <= r ) {
        if( B[i] > B[j] ) {
            cnt += mid - i + 1;
            T[k] = B[j];
            k ++, j ++;
        } else {
            T[k] = B[i];
            k ++, i ++;
        }
    }
    while( i <= mid ) {
        T[k] = B[i];
        k ++, i ++;
    }
    while( j <= r ) {
        T[k] = B[j];
        k ++, j ++;
    }
    for( int w = l ; w <= r ; ++ w ) B[w] = T[w];
}
int check( double mid ) {
    B[0] = 0; cnt = 0;
    for( int i = 1 ; i <= N ; ++ i ) {
        B[i] = B[i - 1] + (double)A[i] - mid;
    }
    msort( 1, N );
    for( int i = 1 ; i <= N ; ++ i )
        cnt += ( B[i] < 0 );
    return ( cnt >= K );
}
int main() {
    N = lztin(), K = lztin();
    for( int i = 1 ; i <= N ; ++ i ) {
        A[i] = lztin();
    }
    double l = 0, r = (double)1e9, mid;
    while( fabs( l - r ) > eps ) {
        mid = ( l + r ) / 2.0;
        if( check( mid ) ) ans = mid, r = mid;
        else l = mid;
    }
    ztyout( ans );
    
    return 0;
}

转载于:https://www.cnblogs.com/ARZhu-NOIpAK/p/6862039.html

### 如何用C语言编写计算平均值的程序 为了实现一个能够处理不定数量元素的一维数组并计算其平均值的C语言程序,可以采用动态内存分配以及利用标准库函数`scanf()`来接收用户输入直到特定条件满足为止。下面展示了一个完整的例子,该例子不仅实现了上述功能还包含了错误检查机制。 #### 动态获取数据并计算平均值 ```c #include <stdio.h> #include <stdlib.h> // 定义最大可能输入的数量以防万一(可以根据实际情况调整) #define MAX_INPUT_SIZE 1000 void calculateAverage(int *array, int size) { double sum = 0; for (int i = 0; i < size; ++i){ sum += array[i]; } printf("The average is %.2f\n", sum / size); } int main() { int count = 0; int numbers[MAX_INPUT_SIZE]; // 假设不会超过MAX_INPUT_SIZE个数字 while(count < MAX_INPUT_SIZE && scanf("%d", &numbers[count]) != EOF){ count++; char ch; if(scanf("%c", &ch) == 1 && ch == '\n'){ break; } else{ ungetc(ch, stdin); // 如果不是换行符,则放回字符流中继续读取下一个整数 } } if(count > 0){ calculateAverage(numbers, count); }else{ fprintf(stderr,"No valid input provided.\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; } ``` 此代码片段展示了如何创建一个简单的命令行应用程序,在不知道确切有多少项要处理的情况下收集用户的输入,并最终输出这些数值的平均值[^1]。这里使用了`while`循环配合`scanf()`来进行连续的数据录入操作直至遇到文件结束标志(`EOF`)或者是遇到了换行符表示完成当前序列的输入[^5]。此外,当所有有效输入被成功解析之后,会调用辅助函数`calculateAverage()`来执行实际的平均值运算逻辑[^3]。 对于更复杂的应用场景比如需要支持更大范围内的输入量或是更加灵活地控制终止条件的话,则应该考虑引入动态内存管理技术如`malloc()`和`realloc()`等API接口以适应不同规模的需求变化[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值