【计蒜客 - 蓝桥训练】轻重搭配(贪心,STLset 或 二分)

题干:

n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 xx 的人可以和体重至少为 2x2x 配对,这样两人只需买一张票。现在给出了 nn 个人的体重,请你计算他们最少需要买几张门票?

输入格式

第一行一个整数 nn,表示人数。

第二行 nn 个整数,每个整数 a_iai​ 表示每个人的体重。

输出格式

一个整数,表示最少需要购买的门票数目。

数据范围

对于 30\%30% 的数据:1 \le n \le 251≤n≤25,1\le a_i \le 1001≤ai​≤100。

对于 60\%60% 的数据:1 \le n \le 100001≤n≤10000,1\le a_i \le 10001≤ai​≤1000。

对于 100\%100% 的数据:1 \le n \le 5\cdot 10^51≤n≤5⋅105,1\le a_i \le 10^51≤ai​≤105。

样例解释

11 和 99 配对,77 和 33 配对,剩下 5,55,5 单独,一共买四张票。

样例输入复制

6
1 9 7 3 5 5

样例输出复制

4

解题报告:

    这题贪心证明(同优则立法),一定可以从前n/2个数中选择就行了,然后从后面剩下的数(可能n/2 也可以 n/2 +1)中选择配对的。。

错误代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
set<int> ss;
set<int> :: iterator it,itt;
int main()
{int n;cin>>n;for(int tmp,i = 1; i<=n; i++) {scanf("%d",&tmp);ss.insert(tmp);}int ans = 0;while(ss.size()) {it = ss.begin();itt = ss.lower_bound(*it * 2);if(itt == ss.end()) break;else ss.erase(itt),ss.erase(it),ans++;}cout << ss.size() + ans << endl;return 0 ;}
/*
6
1 3 5 5 7 9 */

一改:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int a[MAX];
set<int> ss;
set<int> :: iterator it;
int main()
{int n;cin>>n;for(int i = 1; i<=n; i++) {scanf("%d",a+i);}sort(a+1,a+n+1);for(int i = n/2+1; i<=n; i++) {ss.insert(a[i]);}int cur = 1;while(ss.size() && cur <= n/2) {it = ss.lower_bound(a[cur] * 2);
//		printf("it = %d\n",*it);if(it == ss.end()) break;else ss.erase(it);cur++;}cur--;cout << /*ss.size() + n/2 - cur*/n-cur << endl;return 0 ;}
/*
6
1 3 5 5 7 9 */

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 6e5 + 5;
int a[MAX];
multiset<int> ss;
multiset<int> :: iterator it;
int main()
{int n;cin>>n;for(int i = 1; i<=n; i++) {scanf("%d",a+i);}sort(a+1,a+n+1);for(int i = n/2+1; i<=n; i++) {ss.insert(a[i]);}int ans = 0;int cur = 1;while(ss.size() && cur <= n/2) {it = ss.lower_bound(a[cur] * 2);
//		printf("it = %d\n",*it);if(it == ss.end()) break;else ss.erase(it),ans++;cur++;}cur--;cout << ans + (n/2 - cur) + ss.size() << endl;return 0 ;}
/*
6
1 3 5 5 7 9 */

注意点:最后答案的计算,来自三部分别忘了(其实根据标程那个想法更好想)。

  cur从1开始而非从0开始。

   用multiset,而不是set。

  还有一个坑点,,数据范围是5e5,,我一般习惯2e5了,,所以一直WA。。

或者最后答案这么计算:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 6e5 + 5;
int a[MAX];
multiset<int> ss;
multiset<int> :: iterator it;
int main() 
{int n;cin>>n;for(int i = 1; i<=n; i++) {scanf("%d",a+i);}sort(a+1,a+n+1);for(int i = n/2+1; i<=n; i++) {ss.insert(a[i]);}int cur = 1;while(ss.size() && cur <= n/2) {it = ss.lower_bound(a[cur] * 2);
//		printf("it = %d\n",*it);if(it == ss.end()) break;else ss.erase(it);cur++;}cur--;cout << /*ss.size() + n/2 - cur*/n-cur << endl;return 0 ;
}
/*
6
1 3 5 5 7 9
*/

标准的SET的AC代码(233ms):

#include <algorithm>
#include <iostream>
#include <set>
using namespace std;
int a[1000005];
int main() {int n;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}sort(a, a + n);multiset<int> se;for (int i = n / 2; i < n; i++) {se.insert(a[i]);}int ans = n;for (int i = 0; i < n / 2; i++) {multiset<int>::iterator it = se.lower_bound(a[i] * 2);if (it == se.end()) break;se.erase(it);ans--;}printf("%d\n", ans);return 0;
}

另一个线性的做法(不用SET的标程82ms):

#include <algorithm>
#include <cstdio>
using namespace std;
int a[500005];
int main() {int n;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}sort(a, a + n);int ans = n, pos = n / 2;for (int i = 0; i < n / 2; i++) {while (pos < n && a[pos] < a[i] * 2) pos++;if (pos == n) break;ans--;pos++;}printf("%d\n", ans);return 0;
}

这题还可以二分:

后来就想到,如果某种方案配对了x对,那么我们可以统一将这x对中比较大的数字,从大到小依次用a[n],a[n-1]……a[n-x+1]给替换掉;而比较小的数字从小到大依次用a[1]……a[x]替换掉,可知替换出来还是满足条件的方案。另外我们将每一对视作一条边,连接小数字的有序数列和大数字的有序数列,那么会产生一个二分图。
 如果两条边出现交叉,也就是出现a[i]<a[j], a[ii]>a[jj],a[i]*2<=a[ii],a[j]*2<=a[jj]。那么可以将i连接jj而j连接ii。经过一阵重新连接,我们发现,可能的方案等价于a[1]连接a[n-x+1]……a[x]连接a[n],于是现在我们只需要找出具体对于哪个x成立就行了,所以对于这种,已知答案就可以推算是否合理的题目,我们选择二分。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 6e5 + 5;int a[MAX],n;bool ok(int x) {for(int i = 1; i<=x; i++) {if(a[i+n-x]<a[i]*2) return 0;}return 1;
}int main() 
{cin>>n;for(int i = 1; i<=n; i++) scanf("%d",a+i);sort(a+1,a+n+1);int l=0,r=n/2,mid,ans=0;while(l<=r){mid = (l+r)>>1;if(ok(mid)) l=mid+1,ans=mid;else r=mid-1;}printf("%d",n-ans);return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

phpstudy mysql5.1_linux下mysql5.1 和 5.7安装教程详解

本文主要和大家分享linux下mysql 5.1 和 5.7的安装教程&#xff0c;希望能帮助到大家。以下内容的操作系统为&#xff1a;centos 6.7yum安装mysql 5.1.73卸载系统自带的mysql执行以下命令查看是否有自带mysql:rpm -qa | grep mysql如果发现有输出结果,那么执行以下命令依次删除…

【牛客 - 368C】流星雨(概率dp,乘法逆元)

题干&#xff1a; 现在一共有n天&#xff0c;第i天如果有流星雨的话&#xff0c;会有wiwi颗流星雨。 第i天有流星雨的概率是pipi。 如果第一天有流星雨了&#xff0c;那么第二天有流星雨的可能性是p2Pp2P&#xff0c;否则是p2p2。相应的&#xff0c;如果第i−1 (i≥2)i−1 (…

mysql workbench 无法编辑_MySQL Workbench编辑表数据是只读的

14 个答案:答案 0 :(得分&#xff1a;60)我假设桌子有一把主键。首先尝试运行unlock tables命令以查看是否修复了它。如果所有其他方法都失败了&#xff0c;您可以更改表以创建具有自动增量的新主键列&#xff0c;并希望能够修复它。一旦完成&#xff0c;您应该能够毫无问题地删…

【计蒜客 - 蓝桥训练】炮台实验(数学期望,期望dp)

题干&#xff1a; 蒜头君在玩一个战争模拟游戏&#xff0c;他有高度为 1,2,3,\ldots ,n1,2,3,…,n 的炮台各一个&#xff0c;他需要把这 nn 个炮台从左往右排成一行&#xff0c;并且炮口都朝向右边。 在这个游戏中&#xff0c;所有炮台发射的炮弹会摧毁前方所有高度比自己低的…

mysql本身主从_Mysql主从复制

Mysql环境准备#下载Mysqlwget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm如果报错: -bash: wget: 未找到命令安装插件 yum -y install wget安装mysql-community-release-el7-5.noarch.rpmsudo rpm -ivh mysql-community-release-el7-5.noarch.rpm安装Mys…

【蓝桥杯官网试题 - 算法提高 】P0404(模拟)

题干&#xff1a; 计算一个无符号整数的阿尔法乘积。对于一个无符号整数x来说&#xff0c;它的阿尔法乘积是这样来计算的&#xff1a;如果x是一个个位数&#xff0c;那么它的阿尔法乘积就是它本身&#xff1b;否则的话&#xff0c;x的阿尔法乘积就等于它的各位非0的数字相乘所…

phison主控ps3111量产工具_从固态硬盘拆解看门道 深入解读闪存编号和主控容量...

一篇固态硬盘的评测是否有水平&#xff0c;不光是看测试跑分是否详细&#xff0c;更应有针对成绩的解读以及硬件拆解和结构上的分析。毕竟跑分大家都会跑&#xff0c;必须拿出其他人不知道的内存才能真正吸引读者。因为大多数固态硬盘拆解会失去保修&#xff0c;所以拆解是网友…

*【计蒜客 - 蓝桥训练】人以群分(二分 + dp)

题干&#xff1a; 某班有 nn 个同学&#xff0c;每个同学有一个外向程度 a_iai​。由于要进行某个活动&#xff0c;需要把他们分成若干个小组&#xff0c;每个小组的人数至少为 mm 人。不同外向程度的人在一个小组会产生不开心值&#xff0c;定义一个小组的不开心值为组内成员…

alot英文怎么读_【乐学】“原来如此”用英文怎么说?

英语中的“原来如此”则有几种不同的表达下面就让我们一起来看看吧&#xff01;I seeI see 作为最地道的表达&#xff0c;使用起来准没错。这是来自《柯林斯词典》的释义&#xff1a;You can say "I see" to indicate that you understand what someone is telling y…

【牛客 - 318E】爱摸鱼的Dillonh(数学,暴力,细节)

题干&#xff1a; “我不做人啦&#xff0c;jojo&#xff01;” “Dillonh起来回答问题&#xff01;” “啊&#xff1f;”沉迷于jojo的Dillonh又一次上课摸鱼被老师抓到了&#xff0c;他慌忙地抬起头看着讲台上火冒三丈的老师。 “给你一个数n&#xff0c;现在要找到一个集…

特殊mac地址文档_Mac颜值秒杀Win10?五款神器让Win10化身macOS

微软在Win10上捣鼓已经不是一天两天了&#xff0c;可结果……还是难以令人满意&#xff0c;特别是不伦不类的UI&#xff01;其实Win10的底子还是不错的&#xff0c;新技术用了不少&#xff0c;外观也比之前更有颜值&#xff0c;但……总感觉缺了点什么&#xff01;有没有羡慕隔…

【hihocoder - offer编程练习赛60 A】hohahola(贪心,二分)

题干&#xff1a; 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 有一种叫作hohahola的饮料&#xff0c;售价是X元一瓶。小Hi非常喜欢这种饮料&#xff0c;但是他现在身无分文。 不过小Hi有N张优惠券&#xff0c;买hohahola时每瓶最多使用一张优惠券&#xff0c…

checkbox设置三种状态 qt_checkbox的三种状态处理

checkbox只有两种值&#xff1a;选中(checked)或未选中(unchecked)。它可以有任何值&#xff0c;但是表单提交时checkbox的值只能是checked或unchecked。它的默认值是unchecked&#xff0c;你可以在HTML中这样控制它&#xff1a;视觉上&#xff0c;checkbox有三种状态&#xff…

【hihocoder - offer编程练习赛60 B】最大顺子(双指针,思维)

题干&#xff1a; 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 你有N张卡片&#xff0c;每张卡片上写着一个正整数Ai&#xff0c;并且N张卡片上的整数各不相同。 此外&#xff0c;你还有M张百搭卡片&#xff0c;可以当作写着任意正整数的卡片。 一个“顺子…

drupal mysql_Drupal MySQL查询优化

我试图优化一个MySQL查询来加速Drupal视图。这些表是节点&#xff0c;term_node和term_data。节点有大约500k行&#xff0c;term_node大约800k&#xff0c;term_data大约300k。查询下方&#xff1a;SELECT SQL_NO_CACHE DISTINCT(node.nid) AS nidFROM drupal_node nodeLEFT JO…

raft算法mysql主从复制_Etcd raft算法实现原理分析

1.1 主要概念要实现集群数据的一致性&#xff0c;节点在进行通信的时候必定需要遵守特定规则进行数据校验&#xff0c;而这些规则具体都是通过某些具有特定含义的属性来实现的。为了让对Raft 算法比较陌生的读者对算法的关键概念有一个初步认识&#xff0c;作者整理了算法中涉及…

【hihocoder - offer编程练习赛60 C】路径包含问题(LCA,树上倍增)

题干&#xff1a; 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵N的节点的树&#xff0c;节点编号1~N&#xff0c;并且1号节点是根节点。 小Hi会反复询问小Ho一个问题&#xff1a;给定两个节点a和b&#xff0c;有多少对节点c和d满足c < d且c到d的…

【面试题 - 最大值减去最小值小于或等于 num 的子数组数量】滑动窗口

题干&#xff1a; 解题报告&#xff1a; 我们用两个指针&#xff08;i&#xff0c;j&#xff09;分别代表窗口的左边界和右边界&#xff0c;窗口也就是子数组&#xff1b; 用两个双端队列分别维护这个窗口的最大值和最小值&#xff1b; 当窗口扩大时&#xff0c;即j向右扩展时…

mysql根据用户名查询数据_MySQL 查询数据

MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据。 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据。 语法 以下为在MySQL数据库中查询数据通用的 SELECT 语法: SELECT column_name,column_name FROM table_name [WHERE Clause…

【牛客 - 370 I 】Rinne Loves Xor(按位前缀和,异或)

题干&#xff1a; Rinne 最近学习了位运算相关的知识&#xff0c;她想运用自己学习的知识发明一个加密算法。 首先她有一个源数组 A&#xff0c;还有一个密钥数组 B&#xff0c;现在她想生成加密后的数组 C。 她发明的方法是&#xff1a;当计算CiCi的时候&#xff0c;首先将…