卡牌分组([AtCoder ARC073]Ball Coloring)

1. 题目描述:

前两道题说了东东和东东爸过去的故事, 现在我们就预测东东未来几年在小学的生活。

小东东上小学时也许会喜欢一种玩具——卡牌。 这里为了出这道题就设每张卡牌只有一个非负整数属性值。 有一天,
小东东买了N包卡牌,每包里有两张卡牌( 设有一张卡片的属性值是xi,另一张的属性值是yi) (就是说小东东一共买了2N张卡牌) 。
小东东要把每包里的两张卡牌都分开,并分别放到左右两堆(如果认为描述不清楚请仔细食用样例) 。

小东东定义了以下的一些数值:

Lmax:放在小东东左边卡牌堆里的卡牌中属性值最大的卡牌的属性值

2. 输入:

第一行一个整数N表示小东东买了N包卡牌。

接下来有N行,每行包含两个正整数xi, yi表示第i行的两张卡牌的属性值。

3. 输出:

一个整数表示最小的(Rmax ? Rmin)×(Lmax ? Lmin)。

4. 样例:

样例输入1:

3

1 2

3 4

5 6

样例输出1:

15

样例1解释:

最佳方案:x1,x2,y3在左边堆, y1,y2,x3在右边堆。

样例输入2:

3

1010 10

1000 1

20 1020

样例输出2:

380

样例2解释:

一种最佳方案:y1,y2,x3在左边堆, x1,x2,y3在右边堆。

5. 范围:

对于0%的数据与样例一样。

对于32%的数据1 ≤ N ≤ 10

对于另外32%的数据的答案Rmin > Lmax (所有大牌在同一堆, 所有小牌在同一堆)

对于另外36%的数据1 ≤ N ≤ 200,000

对于100%的数据1 ≤ xi , yi ≤ 109

Lmin:放在小东东左边卡牌堆里的卡牌中属性值最小的卡牌的属性值

Rmax:放在小东东右边卡牌堆里的卡牌中属性值最大的卡牌的属性值

Rmin:放在小东东右边卡牌堆里的卡牌中属性值最小的卡牌的属性值

小东东肯定想知道可以算出的最小的(Rmax ? Rmin)×(Lmax ? Lmin)。 但是小东东要玩耍,所以就把这个有趣的任务交给了你。

此题在算法上没什么技术含量,基本是数学讨论;

答案由四个变量构成,而对于一组数据,一定有MAX_W,MIN_W(所有属性值中最大、最小值)分别是定值;

而Lmax(或Rmax)=MAX_W,Lmin(或Rmin)=MIN_W;

所以有两种情况:

  ①MAX_W与MIN_N在不同侧:(假设MAX在左,MIN在右)

    这种情况十分容易处理。左堆上边界固定,右堆下边界固定,因此这种情况下只需要让左堆的值尽量大,右堆的值尽量小;

    即对于任意一对属性值,较大值放在左堆,较小值放在右堆,结束;

  ②MAX_W与MAX_N在同侧:(假设MAX与MIN同在左)

    这种情况处理方式较为繁琐。左堆上下边界固定,因此只需计算 Rmax-Rmin 的最小值;

    关于枚举方式,首先把属性值大值放左堆,小值放右堆(同①),然后根据右堆属性值由小到大排序(当然反过来也可以);

    然后从上到下依次交换左右属性值(交换第一次时MIN_N被换到了左堆);

    关于正确性,排序之后,任意一个左堆属性值Lw[a]一定大于右堆中下标<=a的值;

    即交换后不会导致Rmin减小,但有可能使Rmax和Rmin增大,但对于上一组Rmax与Rmin对应的ans已经计算过了,因此不会对答案造成影响;

  注:MAX_W与MIN_W在同一组时只出现①情况;

AC GET☆DAZE

下面是在下的程序,略乱,见谅;

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<algorithm>
  6 #define ll long long
  7 #define MAX_N 1000000039
  8 using namespace std;
  9 struct card
 10 {
 11     ll lw,rw;
 12 };
 13 card num[200039];
 14 ll lmax=-1,rmax=-1,lmin=MAX_N,rmin=MAX_N,rankmax,rankmin,smax,smin=MAX_N,stpmin=MAX_N;
 15 bool cmp(card a,card b)
 16 {
 17     return a.rw<b.rw;
 18 }
 19 void exc(int k)
 20 {
 21     int stp;
 22     stp=num[k].rw;
 23     num[k].rw=num[k].lw;
 24     num[k].lw=stp;
 25 }
 26 int main()
 27 {
 28     ll ans,stp,stpans,n,a,b,c;
 29     scanf("%lld",&n);
 30     for(a=1;a<=n;a++)
 31     {
 32         scanf("%lld%lld",&b,&c);
 33         num[a].lw=max(b,c);
 34         num[a].rw=min(b,c);
 35         if(num[a].lw>=lmax)
 36         {
 37             lmax=num[a].lw;
 38             rankmax=a;
 39         }
 40         if(num[a].rw<=rmin)
 41         {
 42             rmin=num[a].rw;
 43             rankmin=a;
 44         }
 45         lmin=min(lmin,num[a].lw);
 46         rmax=max(rmax,num[a].rw);
 47     }
 48     ans=(lmax-lmin)*(rmax-rmin);
 49     stp=lmax-rmin;
 50     if(rankmax!=rankmin)
 51     {
 52         sort(num+1,num+1+n,cmp);
 53         for(a=1;a<=n;a++)
 54         {
 55             if(num[a].lw==lmax)
 56             {
 57                 rankmax=a;
 58                 break;
 59             }
 60         }
 61         exc(1);
 62         if(num[1].rw<=num[2].rw)
 63         {
 64             smin=num[1].rw;
 65             rankmin=1;
 66         }
 67         else
 68         {
 69             smin=num[2].rw;
 70             rankmin=2;
 71         }
 72         smax=max(num[1].rw,num[n].rw);
 73         ans=min(ans,stp*(smax-smin));
 74         for(a=2;a<=n;a++)
 75         {
 76             if(a!=rankmax)
 77             {
 78                 exc(a);
 79             }
 80             if(a==rankmin)
 81             {
 82                 if(num[a].rw>num[a+1].rw)
 83                 {
 84                     smin=num[a+1].rw;
 85                     rankmin=a+1;
 86                 }
 87                 else
 88                 {
 89                     smin=num[a].rw;
 90                     rankmin=a;
 91                 }
 92             }
 93             stpmin=min(stpmin,num[a-1].rw);
 94             if(stpmin<=smin)
 95             {
 96                 smin=stpmin;
 97                 rankmin=1;
 98             }
 99             smax=max(smax,num[a].rw);
100             ans=min(ans,stp*(smax-smin));
101         }
102     }
103     printf("%lld",ans);
104     return 0;
105 }

时间: 2024-10-17 07:11:31

卡牌分组([AtCoder ARC073]Ball Coloring)的相关文章

卡牌分组

满足最小分组的长度为其他分组的整数倍 export default (arr) => { // 对这副牌进行排序,升序.降序都可以 arr.sort((a, b) => a - b) let min = Number.MAX_SAFE_INTEGER let dst = [] let result = true for (let i = 0, len = arr.length, tmp = []; i < len; i++) { tmp.push(arr[i]) for (let j =

TCG卡牌游戏研究:《炉石战记:魔兽英雄传》所做的改变

转自:http://www.gameres.com/665306.html TCG演进史 说到卡牌游戏,大家会联想到什么呢? 是历史悠久的扑克牌.风靡全球的<MTG 魔法风云会>与<游戏王>.结合数位与现实的<三国志大战>.或是在手机上掀起收集热潮的<龙族拼图>和<百万亚瑟王>? 卡牌游戏这个统称,其内容可以跟各式各样的玩法结合,而暴风雪新推出的<炉石战记>(以下简称炉石)所选择的玩法,是让玩家自行组牌.进行对战的「集换式卡牌游戏」(

Ball Coloring

6552: Ball Coloring 时间限制: 1 Sec  内存限制: 128 MB提交: 13  解决: 7[提交][状态][讨论版][命题人:admin] 题目描述 There are N bags, each containing two white balls. The i-th box contains two balls with integers xi and yi written on them, respectively.For each of these bags, y

[JLOI2013]卡牌游戏

题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把卡片上的数字向所有玩家展示,然后按顺时针从庄家位置数第X个人将被处决即退出游戏.然后卡片将会被放回卡牌堆里并重新洗牌.被处决的人按顺时针的下一个人将会作为下一轮的庄家.那么经过N-1轮后最后只会剩下一个人,即为本次游戏的胜者.现在你预先知道了总共有M张卡片,也知道每张卡片上的数字.现在你需要确定每个

cocos2d-x 3.3 之卡牌设计 NO.6 Loading界面(异步加载图片,plist)

刚开始做卡牌的时候没有想到要做loading,因为小游戏资源不多. 但是后来不断的加图片,直到在真机上发现卡顿的问题,我才知道该需要加loading了...... 首先,我们先定义类: class Loading : public Layer { public: bool init(); CREATE_FUNC( Loading); static Scene* CreateScene(); int total_pic_num;//需加载图片数 int total_sound_num;//需加载声

卡牌游戏

卡牌游戏 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ 和 java ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 敢于承认不足,敢于去接触和学习,同时又沉稳而镇静 题目 百练 1003 How far can y

BZOJ 4205: 卡牌配对

4205: 卡牌配对 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 173  Solved: 76[Submit][Status][Discuss] Description 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不同. 比如一张X类卡牌属性值分别是225,233,101,一张Y类卡牌属性值分别为11

cocos2d-X 卡牌手机游戏《刀塔传奇》完整源码下载

源码介绍 <刀塔传奇>--cocos2d-x手机游戏源码下载 <刀塔传奇>是一款以Dota故事为背景的动作卡牌手机游戏战斗DEMO,以创新的轻操作战斗玩法,打破传统卡牌游戏操作呆板.无脑等待的瓶颈,玩家指尖手动掌控英雄大招,把握施放大招的顺序,尽享酷炫技能带来的极致视觉体验.<刀塔传奇> iOS/安卓平台长时间高居排行榜榜首,创下了2014年手游人气神话. 大小:7 MB 测试环境 引擎版本:3.0 开发工具:vs2012 测试说明:基于cocos2d-x3.0和vs2

自然系卡牌主要增加血量m--4武侠联盟游戏

在<游戏降临>这一款手游中,有很多不同类型不同属性的卡牌,卡牌一共分为5个系,近百种卡牌,让玩家为之倾心.卡牌分为火,水,自然,雷,光5个系,火系卡牌主要增加攻击力,水系卡牌主要增加幸运,自然系卡牌主要增加血量,雷系卡牌主要增加敏捷,光系卡牌主要增加防御.每一种卡牌都有其特定的作用和效果,只要玩家善于运用和搭配,就能发挥卡牌的最大能量,引爆战争. 战术阵型的作用会愈来愈突出的.举个例子,你的球队实力2000,但却打不过实力1800的球队,这就是阵容战术在作怪!阵型战术的相克原理是:组织克防守,