话不多说:

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

可以发现,针对第一个要求,个数差距最小,当给定个数为偶数时,二分即差距为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~希望大家回去也能好好练习,最近我感觉水平有提升了,还有,那两天没更新,我每天也有练习哦。(当然我最希望没人能看见 嘿嘿)

最新文章

  1. ThinkPHP框架的一些基础应用
  2. 【ASM】ASMSNMP用户已存在
  3. [Notes] Timer Comparision when turn influence computing on/off
  4. Laravel 5 性能优化技巧
  5. visibility和display的异同
  6. 【转】Struts2国际化
  7. 6个关于dd命令备份Linux系统的例子
  8. selenium+python自动化之登录案例
  9. Oracle建立表空间和用户
  10. 初识NoSQL 快速认识NoSQL数据库 分析Analytics For Hackers: How To Think About Event Data
  11. 【leetcode】Intersection of Two Linked Lists(easy)
  12. android视频播放心得体会
  13. c++学习笔记2(c++简单程序)
  14. (转)spring ioc原理(看完后大家可以自己写一个spring)
  15. 结构-行为-样式-Javascript 深度克隆函数(转)
  16. JSP和JavaBean总结
  17. Flask 学习 十三 应用编程接口
  18. Java list.remove( )方法需要注意的地方
  19. 旅游类的APP原型模板分享——Priceline
  20. Selenium IDE 3.6 命令Command详解

热门文章

  1. 无传感FOC控制中的转子位置和速度确定方法一
  2. win10关于后缀名无法关联相应程序默认打开方式的处理方法
  3. (转载)linux下Yum的$releasever和$basearch的取值
  4. 什么是SpringCloudConfig?
  5. Mybatis框架基础入门(四)--SqlMapConfig.xml配置文件简介
  6. 两个链表有一个交点,如何在时间复杂度 O(n) 和 空间复杂度 O(1) 的条件下实现?_字节跳动面试题
  7. 解决MySQL报错ERROR 2002 (HY000)
  8. elasticsearch 了解多少,说说你们公司 es 的集群架构,索 引数据大小,分片有多少,以及一些调优手段 。
  9. 学习Python(一)
  10. C语言形参和实参的区别(非常详细)