话不多说:

该题要求将给定的所有数分为两类,其中这两类的个数差距最小,且这两类分别的和差距最大。

可以发现,针对第一个要求,个数差距最小,当给定个数为偶数时,二分即差距为0,最小;若给定个数为奇数时,差距为1时最小。

针对第二个要求:则将所有给定的数从小到大排列,将前半部分给那个和小些的集合,其余给那个和大的集合,这样做和差距会最大。

以此思路编写代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 101000;
long long ans[maxn] = {0};
bool cmp(long long a, long long b){
if(a != b)
return a < b;
}
int main(){
int n;
long long mx = 0, mn = 0;
cin >> n;
fill(ans, ans + maxn, 0);
for(int i = 0; i < n; i++){
cin >> ans[i];
}
sort(ans, ans + n, cmp);
if(n % 2 == 0){
for(int j = 0; j < n / 2; j++){
mn += ans[j];
}
for(int k = n / 2; k < n; k++){
mx += ans[k];
}
cout << "0" << ' ' << mx - mn;
}else{
for(int l = 0; l < (n - 1) / 2; l++){
mn += ans[l];
}
for(int m = (n - 1) / 2; m < n; m++){
mx += ans[m];
}
cout << "1" << ' ' << mx - mn;
}
return 0;
}

看似没问题,但是这样提交第二个测试点会显示段错误,研究后发现关于cmp的返回判断条件有误,去除if(a != b)该条件后则AC。

研究后发现,具体原因还不是很懂,但是用cmp一定要保证严格弱排序的规则,一定要保证所有情况都有返回bool的值。(刚才那种情况,若a == b时,就没有返回值)。

严格是说在判断的时候会用"<",而不是"<=",弱排序是因为,一旦"<"成立便认为存在"<"关系,返回ture,而忽略了"="关系和">"区别,把它们归结为false。

改进后的代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 101000;
long long ans[maxn] = {0};
bool cmp(long long a, long long b){// 去掉cmp判断条件段错误消失了
return a < b;
}
int main(){
int n;
long long mx = 0, mn = 0;
cin >> n;
fill(ans, ans + maxn, 0);
for(int i = 0; i < n; i++){
cin >> ans[i];
}
sort(ans, ans + n, cmp);
if(n % 2 == 0){
for(int j = 0; j < n / 2; j++){
mn += ans[j];
}
for(int k = n / 2; k < n; k++){
mx += ans[k];
}
cout << "0" << ' ' << mx - mn;
}else{
for(int l = 0; l < (n - 1) / 2; l++){
mn += ans[l];
}
for(int m = (n - 1) / 2; m < n; m++){
mx += ans[m];
}
cout << "1" << ' ' << mx - mn;
}
return 0;
}

总而言之,在PAT中,若题目没有保证所有需要排序的值都是两两不同的(比如这道题),则尽量不要用if(a != b)这样的判断条件,一定要保证cmp函数在所有情况都有返回值!!!!!否则会出现段错误!!!!!

Over~希望大家回去也能好好练习,最近我感觉水平有提升了,还有,那两天没更新,我每天也有练习哦。(当然我最希望没人能看见 嘿嘿)

Day 007:PAT训练--1108 Finding Average (20 分)的更多相关文章

  1. PAT甲级——1108.Finding Average (20分)

    The basic task is simple: given N real numbers, you are supposed to calculate their average. But wha ...

  2. PAT Advanced 1108 Finding Average (20 分)

    The basic task is simple: given N real numbers, you are supposed to calculate their average. But wha ...

  3. 【PAT甲级】1108 Finding Average (20分)

    题意: 输入一个正整数N(<=100),接着输入一行N组字符串,表示一个数字,如果这个数字大于1000或者小于1000或者小数点后超过两位或者压根不是数字均为非法,计算合法数字的平均数. tri ...

  4. PAT (Advanced Level) 1108. Finding Average (20)

    简单模拟. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...

  5. PAT甲题题解-1108. Finding Average (20)-字符串处理

    求给出数的平均数,当然有些是不符合格式的,要输出该数不是合法的. 这里我写了函数来判断是否符合题目要求的数字,有点麻烦. #include <iostream> #include < ...

  6. pat 1108 Finding Average(20 分)

    1108 Finding Average(20 分) The basic task is simple: given N real numbers, you are supposed to calcu ...

  7. 1108 Finding Average (20 分)

    1108 Finding Average (20 分) The basic task is simple: given N real numbers, you are supposed to calc ...

  8. PAT 1108 Finding Average [难]

    1108 Finding Average (20 分) The basic task is simple: given N real numbers, you are supposed to calc ...

  9. 【刷题-PAT】A1108 Finding Average (20 分)

    1108 Finding Average (20 分) The basic task is simple: given N real numbers, you are supposed to calc ...

随机推荐

  1. 用strace处理程序异常挂死情况

    1. 环境: ubuntu 系统 + strace + vim 2.编写挂死程序:(参考博客) #include <stdio.h> #include <sys/types.h> ...

  2. 论文翻译:2021_Acoustic Echo Cancellation with Cross-Domain Learning

    论文地址:https://graz.pure.elsevier.com/en/publications/acoustic-echo-cancellation-with-cross-domain-lea ...

  3. 我们如何监视所有 Spring Boot 微服务?

    Spring Boot 提供监视器端点以监控各个微服务的度量.这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助.但是,使用监视器的一个主要缺点或困 ...

  4. Redis 集群,集群的原理是什么?

    1).Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为master,继续提供服务. 2).Redis Cluster 着眼于扩展性,在单个 redis ...

  5. Vue Avoided redundant navigation to current location Error

    这个报错的根源就是vue-router组件,错误内容翻译一下是: Avoided redundant navigation to current location === 避免冗余导航到当前位置 这个 ...

  6. 如何在 spring 中启动注解装配?

    默认情况下,Spring 容器中未打开注解装配.因此,要使用基于注解装配,我们 必须通过配置 <context:annotation-config/> 元素在 Spring 配置文件 中启 ...

  7. Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?

    Elasticsearch 提供的首个近似聚合是 cardinality 度量.它提供一个字段的基数, 即该字段的 distinct 或者 unique 值的数目.它是基于 HLL 算法的.HLL 会 ...

  8. (stm32f103学习总结)—DS18B20

    一. DS18B20简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式.主要根据应用场合的不同而改变其外观.封装后的DS18B20可用于电缆 ...

  9. 【C++】智能指针详解

    转自:https://blog.csdn.net/flowing_wind/article/details/81301001 参考资料:<C++ Primer中文版 第五版>我们知道除了静 ...

  10. js随手笔记-------理解JavaScript碰撞检测算法核心简单实现原理

    碰撞检测在前端游戏,设计拖拽的实用业务等领域的应用场景非常广泛,今天我们就在这里对于前端JavaScript如何实现碰撞检测算法进行一个原理上的探讨,让大家能够明白如何实现碰撞以及碰撞的理念是什么:1 ...