Day 007:PAT训练--1108 Finding Average (20 分)
话不多说:

该题要求将给定的所有数分为两类,其中这两类的个数差距最小,且这两类分别的和差距最大。
可以发现,针对第一个要求,个数差距最小,当给定个数为偶数时,二分即差距为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 分)的更多相关文章
- PAT甲级——1108.Finding Average (20分)
The basic task is simple: given N real numbers, you are supposed to calculate their average. But wha ...
- PAT Advanced 1108 Finding Average (20 分)
The basic task is simple: given N real numbers, you are supposed to calculate their average. But wha ...
- 【PAT甲级】1108 Finding Average (20分)
题意: 输入一个正整数N(<=100),接着输入一行N组字符串,表示一个数字,如果这个数字大于1000或者小于1000或者小数点后超过两位或者压根不是数字均为非法,计算合法数字的平均数. tri ...
- PAT (Advanced Level) 1108. Finding Average (20)
简单模拟. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...
- PAT甲题题解-1108. Finding Average (20)-字符串处理
求给出数的平均数,当然有些是不符合格式的,要输出该数不是合法的. 这里我写了函数来判断是否符合题目要求的数字,有点麻烦. #include <iostream> #include < ...
- pat 1108 Finding Average(20 分)
1108 Finding Average(20 分) The basic task is simple: given N real numbers, you are supposed to calcu ...
- 1108 Finding Average (20 分)
1108 Finding Average (20 分) The basic task is simple: given N real numbers, you are supposed to calc ...
- PAT 1108 Finding Average [难]
1108 Finding Average (20 分) The basic task is simple: given N real numbers, you are supposed to calc ...
- 【刷题-PAT】A1108 Finding Average (20 分)
1108 Finding Average (20 分) The basic task is simple: given N real numbers, you are supposed to calc ...
随机推荐
- 如何移植sqlite3到嵌入式平台
本人也时常看其他人的blog,搜索资料的目的是尽快解决当前的问题,例如如何移植一个ssh,尽快要明白所需的东西,方能移植完成. 移植sqlite3的步骤如下: 1. 到官方网站下载指定的源码包:htt ...
- const char * 组合理解
1 . const char *ptr 从char *ptr 可以理解为指向字符常量的指针,ptr是一个指向char *的常量,*ptr的值为const,不能修改. 2. char const *pt ...
- 面试官:知道ThreadLocal嘛?谈谈你对它的理解?(基于jdk1.8)
https://zhuanlan.zhihu.com/p/99150038 西北工业大学 计算机技术硕士在读 在java的多线程模块中,ThreadLocal是经常被提问到的一个知识点,提问的 ...
- Java常见的垃圾收集器有哪些?
守拙者_6a98关注 2020.04.11 22:06:31字数 2,135阅读 394 实际上,垃圾收集器( GC , Garbage Collector )是和具体 JVM 实现紧密相关的,不同厂 ...
- mysql 实现类似Oracle 或 db2 sequence
第一步:创建一个索引管理表,其中包含,索引名称.最小值.最大值.当前值.增量,并设置主键为索引名称. CREATE TABLE TB_SEQUENCE ( SEQ_NAME VARCHAR(50) N ...
- 一个tomcat部署两个springboot服务时启动JMX报错
一.问题来源 今天在部署开发好的组件的时候,发现无法启动,检查启动日志,报如下错误: 2022-03-17T10:39:41.823+08:00 ERROR vediomanage.vediomana ...
- 面试问题之操作系统:linux线程API
https://blog.csdn.net/youwotianya/article/details/80933449
- JVM的小总结(转)
ref:http://www.cnblogs.com/ityouknow/p/6482464.html 注1:看了大神:纯洁的微笑的JVM系列篇,发现好多地方还是似懂非懂,理解的并不透彻,jvm的调优 ...
- Postgres数据库知识点
1.批量插入: test_list = []for i in range(100): test_list.append(models.Testmodel(name=i, message="{ ...
- SpringBoot 自定义配置文件不会自动提示问题
参阅:https://www.jianshu.com/p/ec3f0b0371e6