话不多说:

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

可以发现,针对第一个要求,个数差距最小,当给定个数为偶数时,二分即差距为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. JAVA视频笔记(一)

    搭建pho开发环境与框架图 韩顺平 第一章: No1  关于文件以及文件夹的管理 将生成的文本文档做成详细信息的形式,显示文件修改时间以及文件大小,便于文件查看和管理,也是对于一名IT人士高效能工作的 ...

  2. Java基础知识 String StringBuffer StringBuilder三者的区别(面试题)

    相同点:String.StringBuffer.StringBuilder最终底层存储与操作的都是char数组,StringBuffer和StringBuilder都继承了AbstractString ...

  3. Ubuntu16.04 oh_my_zsh 安装与配置

    参考文章 Ubuntu上使终端显示Git分支(oh-my-zsh) oh-my-zsh的安装与基本配置 Ubuntu 下安装oh-my-zsh 前言 之前学习Laravel的时候,经常要切换git分支 ...

  4. 解决Flash CS6初始化字体就自动退出

    系统win7 问题始于安装了同事的字体,启动Flash CS6时界面上显示开始初始化字体...然后 就自动退出了 尝试过进入pe系统删除字体,可是删除不了 网上搜索找到了这一个删除字体的工具FontF ...

  5. 什么是Spring的内部bean?

    当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML的 配置元数据中,可以在 <property/>或 ...

  6. 什么是 Idempotence 以及它在哪里使用?

    幂等性是能够以这样的方式做两次事情的特性,即最终结果将保持不变,即好像 它只做了一次. 用法:在远程服务或数据源中使用 Idempotence,这样当它多次接收指令时,它 只处理指令一次.

  7. scrapy框架初识及使用

    一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等) ...

  8. 学习SVN03

    SVN版本控制系统最佳实践   第1章SVN介绍及应用场景 1.1什么是SVN(Subversion) Svn(subversion)是近年来崛起非常优秀的版本管理工具,与CVS管理工具一样,SVN是 ...

  9. Python学习--21天Python基础学习之旅(Day05、Day06、Day07)

    Day05: Chapter 8 函数 1.1函数定义与调用 1.1.1向函数传递参数 1.2传递实参 1.2.1位置实参:基于实参顺序 1.2.2关键字实参:调用时指出各个实参对应的形参 1.2.3 ...

  10. hanoi(汉诺塔)递归实现

    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序 ...