当前位置: 代码迷 >> 综合 >> B. Game on Ranges
  详细解决方案

B. Game on Ranges

热度:74   发布时间:2023-12-06 03:16:25.0

目录

B. Game on Ranges

A. Robot Cleaner


B. Game on Ranges

原题描述

题意理解(建议先自己把原题描述看一遍再来看我的理解

有一个集合,这个集合的元素是区间,一开始集合里只有一个元素就是[1,n]的区间,对这个集合我们可以选择其中的一个元素(区间),然后在区间内选一个数d,以[l,d-1]和[d+1,r]这两个区间替换掉我们选择的这个区间(l和r分别是我们从集合里面选择出来的这个元素的左端点和右端点)。当然这两个新区间必须存在才行,左端点小于等于右端点。如果不存在就不加入到集合中。我们选择n个数后,集合内元素个数为0,也就是区间个数为0时结束。

现在题目给出的是每次操作时选择的那个区间,要你推出对应的d。比如现在有一个集合S,里面有一个元素,区间[1,6]。

        第一次操作,选[1,6],d取2,对S,删去[1,6],加入[1,1]和[3,6],现S={[1,1],[3,6]}。

        第二次操作,选[1,1]进行操作,d取1,对S,删去[1,1],现S={[3,6]}。

        第三次操作,选[3,6]进行操作,d取6,对S,删去[3,6],加入[3,5],现S={[3,5]}。

        第四次操作,选[3,5]进行操作,d取3,对S,删去[3,5],加入[4,5],现S={[4,5]}。

        第五次操作,选[4,5]进行操作,d取5,对S,删去[4,5],加入[4,4],现S={[4,4]}。

        第六次操作,选[4,4]进行操作,d取4,对S,删去[4,4],现S为空,游戏结束。

现题目打乱顺序的给出[1,6],[1,1],[3,6],[3,5],[4,5],[4,4]这六个区间,要求你推出每个区间对应的d,并输出,可以不按照题目的顺序。

题解

        看似很复杂的一道题,我们可以从简单的角度入手,对于左右端点相等的区间,d只能选择端点值,所以我们先确定所有左右端点相等区间对应的d值。其实我们可以简单的理解为每次操作删掉[1,n]之间的一个数,所以删过的数就不可能再次出现,也就是每个区间对应的d值都不相同。所以我们标记掉出现过的d。于是我们有了这样一个思路,随着迭代的进行被标记的d越来越多,对于区间越来越大,但是找到d的难度相当,因为区间越大时被标记的d就越多。我们将区间以从小到大的顺序排列,对于长度为1的区间直接找到d值,对于长度为2的区间只有两个可能的d值,但此前我们标记了一个d值,所以对于长度为2的区间也只有一个确定的d值,以此类推。所有的区间我们都能找到一个d值与之对应。

AC代码


/*@_krito*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define LM LLONG_MAX
#define IM INT_MAX
#define N 1001
struct pair1{int l;int r;int len;int d=0;
};
bool cmp(pair1 a,pair1 b){return a.len<b.len;
}int main(){int t;cin>>t;while(t--){bool vis1[N]={0};int n,ans[N];cin>>n;pair1 a[N];for(int i=1;i<=n;i++){cin>>a[i].l>>a[i].r;a[i].len=a[i].r-a[i].l;}sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){if(a[i].l==a[i].r){a[i].d=a[i].l;vis1[a[i].d]=true;}else {for(int j=a[i].l;j<=a[i].r;j++){if(!vis1[j]){a[i].d=j;vis1[j]=true;}}}}for(int i=1;i<=n;i++) cout<<a[i].l<<" "<<a[i].r<<" "<<a[i].d<<endl;}
}

这里一并附上A的AC代码.

A. Robot Cleaner

原题描述

 题解

        一个机器人先斜向下走,走到底了就斜向上走,以机器人为中心的横竖两条线碰到星星了就算成功,游戏结束。题目给出机器人初始坐标和星星初始坐标,每秒走一步,输出机器人吃到星星所要用的秒数。横竖分别算个步数出来,取小的那个输出即可。这题从读题到AC花了我不到5分钟。

AC代码

/*@_krito*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define LM LLONG_MAX
#define IM INT_MAX
#define for(i,a,b) for(int i=a;i<=b;i++)int main(){int t;cin>>t;while(t--){int m,n,tb,cb,td,cd,x,y;cin>>m>>n>>tb>>cb>>td>>cd;if(tb<=td) x=td-tb;else {x=m-tb+m-td;}if(cb<=cd) y=cd-cb;else{y=n-cb+n-cd;}int ans=y<x?y:x;cout<<ans<<endl;}
}

——————————————————分割线——————————————————————

        《关于我考试周为什么不复习而是在刷codeforces这件事》

这里推荐一首歌送给考试周的各位。

《孤勇者》 陈奕迅

都 是勇敢的

你额头的伤口 你的 不同 你犯的错

都 不必隐藏

你破旧的玩偶 你的 面具 你的自我

他们说 要带着光 驯服每一头怪兽

他们说 要缝好你的伤 没有人爱小丑

为何孤独 不可 光荣

人只有不完美 值得歌颂

谁说污泥满身的不算英雄

爱你孤身走暗巷

爱你不跪的模样

爱你对峙过绝望

不肯哭一场

爱你破烂的衣裳

却敢堵命运的枪

爱你和我那么像

缺口都一样

去吗 配吗 这褴褛的披风

战吗 战啊 以最卑微的梦

致那黑夜中的呜咽与怒吼

谁说站在光里的才算英雄

他们说 要戒了你的狂

就像擦掉了污垢

他们说 要顺台阶而上

而代价是低头

那就让我 不可 乘风

你一样骄傲着 那种孤勇

谁说对弈平凡的不算英雄

爱你孤身走暗巷

爱你不跪的模样

爱你对峙过绝望

不肯哭一场

爱你破烂的衣裳

却敢堵命运的枪

爱你和我那么像

缺口都一样

去吗 配吗 这褴褛的披风

战吗 战啊 以最卑微的梦

致那黑夜中的呜咽与怒吼

谁说站在光里的才算英雄

你的斑驳 与众不同

你的沉默 震耳欲聋

You Are The Hero

爱你孤身走暗巷

爱你不跪的模样

爱你对峙过绝望

不肯哭一场 (You Are The Hero)

爱你来自于蛮荒

一生不借谁的光

你将造你的城邦

在废墟之上

去吗 去啊 以最卑微的梦

战吗 战啊 以最孤高的梦

致那黑夜中的呜咽与怒吼

谁说站在光里的才算英雄

 这首歌最近似乎很火,但他和普通的网红歌曲是云泥之别的。

  相关解决方案