首先是签到题部分:A,E,I. 传送门:点击打开链接
然后是DP部分:C,G,H. 传送门:点击打开链接
还有其他:B,J,H,F.
神奇的B题(我的第一个一血)
问题 B: 拯救小鸡
时间限制: 1 Sec 内存限制: 128 MB提交: 73 解决: 36
[ 提交][ 状态][ 讨论版]
题目描述
鸡国国王为了保护鸡国中的小鸡,决定派出鸡国警察(鸡国有无穷多个警察)来巡逻。
每个警察巡逻的时间长度都为 t 秒。当老鹰来袭击的时刻至少要有 x 名警察才能抵御老鹰的袭击。另外国王派遣警察有两个原则:
(1)每个时刻最多只能派遣一名警察。在第 0 秒时刻及第 0 秒之前的时刻(鸡国有负数时刻)也可以事先准备派遣警察,但每个时刻最多也只能派遣一名警察。
(2)延迟 1 秒执行巡逻任务。第 i 秒时刻派遣的警察,在第 i+1 到 i+t 秒时刻执行巡逻任务。
为帮助国王节省开支,请帮忙计算至少需要派遣多少名警察才能保证鸡国小鸡不被老鹰抓走?
输入
第 1 行输入三个整数 n,t,x,分别表示老鹰总共袭击次数,每个警察巡逻的时间长度为,以及某个时刻能抵挡住老鹰袭击的最少警察数量。
第 2 行 n 个严格升序排列的正整数 t i (1≤i≤n),表示第 t i 秒时刻老鹰会发动袭击。
输出
样例输入
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: 【搜索】泡泡龙
时间限制: 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
[ 提交][ 状态][ 讨论版]
题目描述
互不相同,即来领过钱的鸡不能再来,否则将受到严厉的处罚。
但聪明的鸡国老百姓侦察后发现国王每天发的钱袋子里面装的钱数量是不一样的(同一天的相同),第 i 天发的每一袋钱为 a i 元。如果第 i 天来领钱的鸡领 1 袋钱,它可以获得ai 元的“鸡币”,如果它领 2 袋钱,则可以获得 2×ai 元“鸡币”,当然它也可以放弃,则第i 天的钱国王收回国库。
由于鸡国生活条件优越和鸡的贪念等原因,当第 i 天领钱的鸡同时满足以下两个条件时它才会感到幸福:
(1)领到的钱不能低于鸡国的平均收入 m 元。
(2)要跟它前面领了钱且感到幸福的鸡一样幸福或者更幸福。
仁慈的国王希望鸡国的每一只鸡都能感到幸福,请你帮国王规划一下在这 n 天中怎样给每一只发钱才能让最多的鸡感到幸福?
输入
第 1 行输入两个整数 n 和 m,分别表示发钱的天数(或理解为来领钱的鸡数)和鸡国的平均收入。
第 2 行 n 个正整数 ai (1≤i≤n),依次表示第 i 天发的一袋钱中的“鸡币”为 ai 元。。
当时没做出来,现在看到了别人的题解。传送门:点击打开链接
还有F题
问题 F: match
时间限制: 1 Sec 内存限制: 128 MB提交: 71 解决: 27
[ 提交][ 状态][ 讨论版]
题目描述
输入
输出
如果能找到,输出包含 3 行,第 i 行对应九宫格的第 i 行(最后一行行末要换行)。
如果有多种方案,请输出每种方案对应的字符串中字典序最前的一种(将行与行首尾相连,就可以得到一个字符串)。
样例输入
ANA
ANA
DAR
DAR
RAD
RAD
样例输出
DAR
ANA
RAD
题目很容易让人懂,要注意字典序输出。由于题目数据量很小,完全可以暴力模拟每一个单词,最后得到结果。
贴一下学长的代码,传送门:点击打开链接
总结
感觉还不错,但还是有还多要深入研究的,知识多了,做题自然简单,就像H题,当初备战省赛做了48道DP专题,遇到了类似的题,虽然省赛没用到,但迟早会遇到,暑假才刚开始,暑假过后,必须拿出点成绩。