题目网址

https://vijos.org/d/Randle/p/5a0011e1d3d8a10a532d6d71

题目描述

在桌面上放着n张纸牌,每张纸牌有两面,每面都写着一个非负整数。你的邪王真眼可以看到所有牌朝上的一面和朝下的一面写的数字。现在你需要将一些牌翻过来,使得所有牌朝上的一面中,至少有一半(≥n/2)的数字是一样的。请你求出最少需要翻几张牌,或者判断无解。注意:在翻牌的时候,你不能把牌扔掉,不能偷偷把别的牌放进来,也不能用笔涂改牌上面的数字。

输入格式

第一行包含一个整数n,表示牌的数量;接下来n行,每行两个非负整数ai, bi,表示每张牌上写的两个数字,ai对应朝上的一面,bi对应朝下的一面。

输出格式

如果有解,则输出一个整数,表示最少的翻牌次数,否则输出Impossible。

样例

样例输入1

3
1 2
2 1
3 4

样例输出1

1

样例输入2

3
1 2
3 4
5 6

样例输出2

Impossible

样例说明

样例解释1

把第一张牌翻过来,那么就有两个2一个3朝上了,2的数量超过了半数。

样例解释2

所有数字都只有一个,因此相同的数字数超过半数是不可能的。

数据范围

ai,bi<=10^9,n<=3*10^5
对所有数据,有n>0,ai, bi≥0。

题解

本题扫一眼会觉得很简单,但是再扫一眼,就会发现,真的是很烦。

首先,本题很难枚举翻哪一张牌,因为可以同时翻好几张牌。那么,本题的难点就是在于问题的转化。

不好枚举翻哪一张牌,那么我们就枚举哪一种牌可以翻。

如样例1,出现次数最多的是2,那么我们就可以枚举出翻含有2的牌的次数。

但是本题还有一个细节:出现次数最多的数字一定只需要翻最少次数吗?当然不一定,这种情况一定要考虑。

另外,本题还用到了离散化,离散化可以用map来实现

再把思路整理一遍

1.读入n

2.进行n次操作,每次读入ai和bi,利用map,将ai和bi分开进行离散化处理

注意:如果ai和bi的值相等,那么只能存储一次,以为这种牌无论翻不翻都一样

3.读入ai和bi的同时,将他们存放在一个数组中,并在读入结束后对该数组(用A[]表示)进行排序(理论上该排序没有任何意义,但是加上以后确实能快一点)

4.从1开始枚举A[]中左右的元素,对其出现次数进行判断,看能否满足超过一半的条件。如果可以,计算出它需要的最少次数,并对所有可行方案求最小值

代码

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std; const int N=; map<int,int> M0,M1;
int A[*N];
int n,m,a[N],b[N],ans=N; void init()
{
scanf("%d", &n);
for (int i=; i<=n; i++)
{
scanf("%d %d",&a[i], &b[i]);
if (a[i]==b[i]) M0[a[i]]++;//记录a的次数
else M0[a[i]]++, M1[b[i]]++;
A[++m]=a[i];//将所有出现的数都放在A[]中
A[++m]=b[i];
}
sort(A+,A+m+);
} void work()
{
for (int i=; i<=m; i++)//枚举在最终要翻的牌面数字
{
int x=M0[A[i]],y=M1[A[i]];
if (x+y>=(n+)/)
ans=min(ans,max((n+)/-x,));
}
if (ans==N)printf("Impossible\n");
else printf("%d\n",ans);
return;
} int main()
{
init();
work();
return ;
}

出处:https://www.cnblogs.com/yujustin/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

温馨提示:尽量使用版本较高的浏览器,并打开极速模式。

Vijos 纸牌的更多相关文章

  1. vijos题解

    Vijos题解 题库地址:https://vijos.org/p P1001 谁拿了最多奖学金 题意:按照指定要求计算奖学金,直接用if判断即可 #include<iostream> us ...

  2. 【BZOJ 1061】【Vijos 1825】【NOI 2008】志愿者招募

    http://www.lydsy.com/JudgeOnline/problem.php?id=1061 https://vijos.org/p/1825 直接上姜爷论文... #include< ...

  3. code vs 1098 均分纸牌(贪心)

    1098 均分纸牌 2002年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解   题目描述 Description 有 N 堆纸牌 ...

  4. C语言-纸牌计算24点小游戏

    C语言实现纸牌计算24点小游戏 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的.程序主要功能已完成,目前还有部分细节 ...

  5. vijos P1915 解方程 加强版

    背景 B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜..... 为了安慰可怜的B酱, vijos刻意挂出来了真实的题目! 描述 已 ...

  6. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

  7. 【BZOJ 2541】【Vijos 1366】【CTSC 2000】冰原探险

    http://www.lydsy.com/JudgeOnline/problem.php?id=2541 https://vijos.org/p/1366 loli秘制大爆搜_(:з」∠)_坑了好久啊 ...

  8. 【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流

    http://www.lydsy.com/JudgeOnline/problem.php?id=1065 https://vijos.org/p/1826 好难的题啊TWT ∈我这辈子也想不出来系列~ ...

  9. 一起来做webgame,《Javascript蜘蛛纸牌》

    不得不说,做游戏是会上瘾的,这次带来的是win系统上的经典游戏<蜘蛛纸牌>,不能完美,但求一玩 移牌 0 次 Javascript game_蜘蛛纸牌 正在努力加载... // " ...

随机推荐

  1. SharePoint2010 HTTP Error 503. The service is unavailable 解决方法

    1.更改系统管理员用户密码前提 因为更改系管理员用户密码会影响到 "SharePoint2010"正常运行,所在尽量不要更改系统管理员用户的密码, 必须更改密码的话,需要注意以两点 ...

  2. js:JSON对象与JSON字符串转换

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式. 同时,JSON是 JavaScript 原生格式,这 ...

  3. Dynamics CRM GBK编码

    Dynamics CRM用文本汉字为条件去请求数据时,传过去的竟然是GBK编码⊙_⊙ 下面这段代码解决了我的问题,这是拷贝自网上一位大神的博客: http://qq100002656.blog.163 ...

  4. Flask入门 表单Flask-wtf form原生 Bootstrap渲染(七)

    (1) 原生的表单 模板页面,form表单form.html <form action="{{ url_for('/check/') }}" method='post'> ...

  5. MySQL 5.7 修改数据物理文件目录

    修改MySQL数据库物理文件存放位置,需要在MySQL配置文件中修改相关参数.安装MySQL5.7后,在MySQL安装目录下没有找到数据库物理文件,最后经过查找发现其在“C:\ProgramData\ ...

  6. 【LOJ2461】「2018 集训队互测 Day 1」完美的队列(分块+双指针)

    点此看题面 大致题意: 让你维护\(n\)个有限定长度的队列,每次区间往队列里加数,求每次加完后的队列里剩余元素种类数. 核心思路 这道题可以用分块+双指针去搞. 考虑求出每个操作插入的元素在队列中被 ...

  7. cftool拟合&函数逼近

    cftool拟合&函数逼近 cftool 真是神奇,之前我们搞的一些线性拟合解方程,多项式拟合,函数拟合求参数啊,等等. 已经超级多了,为啥还得搞一个cftool拟合啊?而且毫无数学理论. 如 ...

  8. 【转】Android手机分辨率基础知识(DPI,DIP计算)

    1.术语和概念 术语 说明 备注 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 摩托罗拉milestone手机是3.7英寸 A ...

  9. PHP处理Excel

    今天一个朋友问我PHP怎么导出Excel,然后我就去网上搜刮了一下资料,发现不错的第三方类PHPExcel(可以导入导出)和PHP-ExcelReader(导入).那就给大家分享一下! 一.PHP导入 ...

  10. 【luogu P1113 杂务】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1113 菜 #include <queue> #include <cstdio> #i ...