话不多说:

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

可以发现,针对第一个要求,个数差距最小,当给定个数为偶数时,二分即差距为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. J20航模遥控器开源项目系列教程(七)PPM输出 | 关于按键版本和旋转编码器版本的兼容说明、布局建议 | 关于MINI版PCB的兼容说明

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/J ...

  2. 关于List、Set、Map接口讲解

    概述 List.Set接口都是继承于Collection主接口,而Map为独立接口 1.List接口下有ArrayList.Vector.LinkedList实现类 2.Set接口下有HashSet. ...

  3. Blazor 003 : Razor的基础语法

    上文,我们通过剖析一个最简单的 Blazor WASM 项目,讲明白了 Razor 文件是什么,以及它被转译成 C#后长什么样子.也介绍了 Razor 中最简单的一个语法:Razor Expressi ...

  4. Hibernate学习一:Hebinate入门以及一些小问题

    1:Hebinate框架的简述: Hebinate框架主要用用在javaee开发中的dao层设计,实现对数据库的crud等操作, Hibernate的底层通过jdbc实现,通过对jdbc的封装,实现对 ...

  5. Lock 深入理解acquire和release原理源码及lock独有特性acquireInterruptibly和tryAcquireNanos

    https://blog.csdn.net/sophia__yu/article/details/84313234 Lock是一个接口,通常会用ReentrantLock(可重入锁)来实现这个接口. ...

  6. Java并发机制(7)--线程池ThreadPoolExecutor的使用

    Java并发编程:线程池的使用整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3932921.html 1.什么是线程池,为什么要使用线程池: 1.1. ...

  7. Kafka 都有哪些特点?

    高吞吐量.低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作. ...

  8. JVM内存模型小结

    JVM运行时的数据区域划分图如下,该图是JVM内存模型最主要的内容. 从图中可以看出来,JVM将内存主要划分为五个部分:程序计数器.Java虚拟机栈.本地方法栈.Java堆和方法区.这些被划分为用途不 ...

  9. 阐述final、finally、finalize的区别?

    - final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词.将变量声明为final,可以保证它们在使用中不被 ...

  10. mysql 的INNODB引擎和MYISAM引擎的区别、索引相关

    两个引擎都是使用B+tree 数据结构作为索引 不同点: 1.INNODB的主键必须要有,同时也是聚集索引,INNODB的数据文件本身就是索引文件:而MYISAM则是存储了数据的地址 2.INNODB ...