中石油 暑期集训个人赛第一场 题解

首先是签到题部分:A,E,I.    传送门:点击打开链接

然后是DP部分:C,G,H.        传送门:点击打开链接

还有其他:B,J,H,F.


神奇的B题(我的第一个一血)

问题 B: 拯救小鸡

时间限制: 1 Sec   内存限制: 128 MB
提交: 73   解决: 36
[ 提交][ 状态][ 讨论版]

题目描述

鸡国最近遇到了一件很棘手的事情,经常有一只老鹰想来抓小鸡。经鸡国情报员探查,这只老鹰打算共来袭击 n 次,第 i 次来的时刻为第 t i  (1≤i≤n)  秒时刻。 
鸡国国王为了保护鸡国中的小鸡,决定派出鸡国警察(鸡国有无穷多个警察)来巡逻。
每个警察巡逻的时间长度都为 t 秒。当老鹰来袭击的时刻至少要有 x 名警察才能抵御老鹰的袭击。另外国王派遣警察有两个原则: 
(1)每个时刻最多只能派遣一名警察。在第 0 秒时刻及第 0 秒之前的时刻(鸡国有负数时刻)也可以事先准备派遣警察,但每个时刻最多也只能派遣一名警察。 
(2)延迟 1 秒执行巡逻任务。第 i 秒时刻派遣的警察,在第 i+1 到 i+t 秒时刻执行巡逻任务。 
为帮助国王节省开支,请帮忙计算至少需要派遣多少名警察才能保证鸡国小鸡不被老鹰抓走? 

输入

输入共 2 行。 
第 1 行输入三个整数 n,t,x,分别表示老鹰总共袭击次数,每个警察巡逻的时间长度为,以及某个时刻能抵挡住老鹰袭击的最少警察数量。 
第 2 行 n 个严格升序排列的正整数 t i  (1≤i≤n),表示第 t i 秒时刻老鹰会发动袭击。 

输出

输出 1 行一个整数,表示总共至少需要派遣多少个警察才能抵御老鹰的 n 次袭击,如果出现无法抵御老鹰的袭击时,输出“-1”(不包含双引号)。 

样例输入

3 3 3
2 3 4

样例输出

5

做题的时候没看榜,一看初中组,感觉不会太难,就按顺序做,一小时左右A到,才发现是B题的一血。

这题真没想到模拟也可以过,还不超时。这题最终可以归结为求重复区间的问题,枚举时间轴,时间的区间是固定的。用数组标记老鹰出现的时间小鸡的个数,枚举时间的左端点,再枚举老鹰出现的时间,若重合,则+1.最后扫一遍标记数组,如有未达到目标的,直接输出-1.


代码实现:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>

using namespace std;

int main()
{
	int n,t,x,a[100005],i,j,count,visit[100005];
	while(cin>>n>>t>>x)
	{
		memset(visit,0,sizeof(visit));
		for(i=0;i<n;i++)
		cin>>a[i];
		int flag=0,ans=0;
		
		for(j=a[0]-t+1;j<=a[n-1];j++)
		{
			for(i=0;i<n;i++)
			{
				if(j+t>a[i])
				{
					visit[i]++;
				}
			}
			ans++;
			if(visit[n-1]>x)
			break;
		}
		for(i=0;i<n;i++)
		if(visit[i]<x)
		flag=1;
		if(flag)
		cout<<"-1"<<endl;
		else
		cout<<ans<<endl;
	}
	return 0;
}


简单的J题

问题 J: 【搜索】泡泡龙

时间限制: 1 Sec   内存限制: 64 MB
提交: 156   解决: 63
[ 提交][ 状态][ 讨论版]

题目描述

这是一个简化版的网络游戏:在一个N×N方块构成的棋盘中,每个方块均涂上红、黄、蓝、绿(记为l、2、3、4)中的一种颜色,游戏者可以在最底行任意找一个方块,用鼠标双击这个方块,于是该方块及与之相邻(即在上、下、左、右四个方向上有公共边)的所有的同色方块均被消掉,而因下方失去支持的方块将会自由落下填补空位。样例中给出一个4×4的棋盘样例,当游戏者双击最底层左边第二个方块后,将会形成输出结果的布局。
你的任务是编写一个泡泡龙模拟程序,对于给定的一个初始棋盘,计算游戏者双击最底层某个方块后棋盘的布局将会如何。

输入

第1行有两个正整数N和M(I≤M≤N≤I00),其中N表示棋盘的规模,而M则表示游戏者将双击最底层从左边数起的第M个方块。接下来的N行每行有N个l~4的整数组成,表示一个初始的棋盘,同一行相邻两个数之间用一个空格隔开。

输出

N行,每行用N个数给出游戏结束后棋盘的布局,没有方块的格子用0表示,同一行相邻两个数之间也用一个空格分开。每行末尾有空格

样例输入

4 2
1 2 3 4
4 2 4 4
3 4 4 3
1 4 4 3

样例输出

1 0 0 0 
4 0 0 0 
3 2 0 3 
1 2 3 3 


搜索的水题啊,dfs把相同且相邻的标记为0,然后再把不是0的落下来,上面的补成0.这种题竟然做了半小时。脑卡。


代码实现

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

int next1[4][2]={1,0,0,1,-1,0,0,-1};
int map[105][105];
int n,s;

void dfs(int x,int y,int z)
{
	int i;
	for(i=0;i<4;i++)
	{
		int tx=x+next1[i][0];
		int ty=y+next1[i][1];

		if(tx<0||tx>=n||ty<0||ty>=n)
		continue;
		
		if(map[tx][ty]==z)
		{
			map[tx][ty]=0;
			
			dfs(tx,ty,z);
		}
	}
	return ;
}

void find()
{
	int i,j,k;
	for(i=n-1;i>=0;i--)
	{
		for(j=0;j<n;j++)
		{
			if(map[i][j]==0)
			{
				for(k=i;k>=0;k--)
				{
					if(map[k][j])
					{
						map[i][j]=map[k][j];
						map[k][j]=0;
						break;
					}
				}
			}
		}
	}
}

int main()
{
	int i,j;
	while(cin>>n>>s)
	{
		memset(map,0,sizeof(map));
		for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		cin>>map[i][j];
		
		int z=map[n-1][s-1];
		dfs(n-1,s-1,z);
		map[n-1][s-1]=0;
		find();
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			cout<<map[i][j]<<' ';
			
			cout<<endl;
		}
	}
	return 0;
}

蒙蔽的D题

问题 D: 鸡国福利

时间限制: 1 Sec   内存限制: 128 MB
提交: 115   解决: 9
[ 提交][ 状态][ 讨论版]

题目描述

鸡国为了表彰鸡国每一只鸡在过去一年的优秀表现,打算在接下来的 n 天中每天给鸡国的一只鸡发 1 袋或者 2 袋“鸡币”(鸡国的通用货币)作为福利。国王要求每天来领钱鸡
互不相同,即来领过钱的鸡不能再来,否则将受到严厉的处罚。 
但聪明的鸡国老百姓侦察后发现国王每天发的钱袋子里面装的钱数量是不一样的(同一天的相同),第 i 天发的每一袋钱为 a i 元。如果第 i 天来领钱的鸡领 1 袋钱,它可以获得ai 元的“鸡币”,如果它领 2 袋钱,则可以获得 2×ai 元“鸡币”,当然它也可以放弃,则第i 天的钱国王收回国库。 
由于鸡国生活条件优越和鸡的贪念等原因,当第 i 天领钱的鸡同时满足以下两个条件时它才会感到幸福: 
(1)领到的钱不能低于鸡国的平均收入 m 元。 
(2)要跟它前面领了钱且感到幸福的鸡一样幸福或者更幸福。 
仁慈的国王希望鸡国的每一只鸡都能感到幸福,请你帮国王规划一下在这 n 天中怎样给每一只发钱才能让最多的鸡感到幸福? 

输入

输入共 2 行。 
第 1 行输入两个整数 n 和 m,分别表示发钱的天数(或理解为来领钱的鸡数)和鸡国的平均收入。 
第 2 行 n 个正整数 ai  (1≤i≤n),依次表示第 i 天发的一袋钱中的“鸡币”为 ai 元。。 

当时没做出来,现在看到了别人的题解。传送门:点击打开链接


还有F题

问题 F: match

时间限制: 1 Sec   内存限制: 128 MB
提交: 71   解决: 27
[ 提交][ 状态][ 讨论版]

题目描述

小 x 在解说 F7 决赛时的搭档是韩乔生,以至于小 x 没有任何能说上话的机会。无聊的他玩起了填字游戏。一个 3*3 的九宫格里,每个格子里都被填上了一个字母,从而我们得到了 6 个单词。现在,小 x 随手写了 6 个单词,他想让你帮他找到一种填字母的方案,使得这 6 个单词都出现在了九宫格里。

输入

共六行,每行一个长度为 3 的单词(全部大写)。

输出

如果找不到方案,输出“0”(不包含引号)
如果能找到,输出包含 3 行,第 i 行对应九宫格的第 i 行(最后一行行末要换行)。
如果有多种方案,请输出每种方案对应的字符串中字典序最前的一种(将行与行首尾相连,就可以得到一个字符串)。

样例输入

ANA
ANA
DAR
DAR
RAD
RAD

样例输出

DAR
ANA
RAD

题目很容易让人懂,要注意字典序输出。由于题目数据量很小,完全可以暴力模拟每一个单词,最后得到结果。

贴一下学长的代码,传送门:点击打开链接


总结

感觉还不错,但还是有还多要深入研究的,知识多了,做题自然简单,就像H题,当初备战省赛做了48道DP专题,遇到了类似的题,虽然省赛没用到,但迟早会遇到,暑假才刚开始,暑假过后,必须拿出点成绩。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值