2019 训练计划——DFS+贪心专题( 每天10题 ) 训练计划①
发布日期:2021-06-29 14:25:25 浏览次数:2 分类:技术文章

本文共 4893 字,大约阅读时间需要 16 分钟。

A


题目大意

给你一个合法的括号序列,每次操作分两步,第一步删除第一个左括号,第二步删除某一个右括号,要保证删除之后的括号序列还是合法的,求将括号删到空为止一共有多少种不同的删除方法,两种方法不同当且仅当存在某一步右括号的删除位置不同,答案膜1e9+7


题解

贪心,直接遍历,数据量大用long long 遇到左括号让当前方案数+1 如果遇到右括号 左右括号删除 sum要乘上当前方案数

#include
using namespace std;typedef long long ll;const int mod=1e9+7;const int maxn=2500+10;char ss[maxn];int main(){
ll sum=1; scanf("%s",ss); int len=strlen(ss); int ans=0; for(int i=0;i

B


题目大意

小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。

小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。
障碍物不能通过。小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1);
小明想要知道,现在他能否从起点走到终点。


题解

直接模板dfs爆搜 剪枝条件很常规

#include
#define mst(a,b) memset(a,b,sizeof(a))using namespace std;const int maxn=500+10;char mp[maxn][maxn];int n,m;int sx,sy;int vis[maxn][maxn];int dx[]={
1,0,-1,0};int dy[]={
0,1,0,-1};bool judge(int x,int y){
if(!vis[x][y]&&mp[x][y]!='#'&&x>=0&&x
=0&&y
>n>>m){
mst(vis,0); for(int i=0;i
>mp[i][j]; if(mp[i][j]=='S') sx=i,sy=j; } } if(dfs(sx,sy)) cout<<"Yes"<

C


题目大意

就是为了让你简便他的运算方式 从小到大


题解

只要是数字就用另一个数组存起来 然后从小到大排一下序 注意最后输出方式即可

#include
using namespace std;const int maxn=200+10;int n;char s[maxn];char ss[maxn];int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>s){
int n=strlen(s); int k=0; for(int i=0;i
='0'&&s[i]<='9'){
ss[k++]=s[i]; } } sort(ss,ss+k); for(int i=0;i

D


题目大意

让骨牌m x n 场地内放最多数目


题解

此题关键在于两边都是奇数边的时候,贪心策略在于尽量让偶数变与骨牌的2平行 这样可以最大化 一般情况就是(m*n)>>1 但是对于特殊情况:两边都为奇数时,由于n≥m 优先考虑n 让骨牌的2与列平行 可以推出 (m-1) * n / 2 + (n - 1 ) / 2 化简得到(n * m - 1) / 2

其实就是(n*m)>>1 公式一出来 完全就是水题了

#include
using namespace std;int main(){
int n,m; cin>>n>>m; cout<<((n*m)>>1)<

E


题目大意

匹配" hello "


题解

用另一个数组存hello 然后爆搜

#include
using namespace std;const int maxn=100+10;char s[maxn];char ss[]="hello";int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>s){
int n=strlen(s); int k=0; for(int i=0;i

F


题目大意

双胞胎,一个想拿更多的钱,但是又想让硬币最少化


题解

将硬币的价值从大到小排序,然后贪心拿,如果发现当前的价值已经超过了总价值的一半就结束贪心

#include
using namespace std;const int maxn=100+10;int a[maxn];int n,sum,ans;int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){
sum=0,ans=0; for(int i=0;i
>a[i]; sum+=a[i]; } sort(a,a+n,greater
()); int cnt=0; for(int i=0;i
sum) break; } cout<
<

G


题目大意

想将盒子里的方块移动位置


题解

结合题意,排一下序就好了

#include
using namespace std;const int maxn=100+10;int n,a[maxn];int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){
for(int i=0;i
>a[i]; sort(a,a+n); for(int i=0;i

H


题目大意

n个同学,m个礼物,求买的这n个礼物里面最高价格和最低价格之差的最小值


题解

排序一下,然后找出n个礼物,遍历求最高与最低价格之差,求出min值

#include
using namespace std;const int maxn=100+10;int n,m,a[maxn];int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>n>>m){
for(int i=0;i
>a[i]; sort(a,a+m); int remax=100000; for(int i=0;i

I


题目大意

给你一个n 让你最后判断那两个人能否完成1-n水平


题解

相当于区间汇合,最后判断1-n是否都有

#include
using namespace std;const int maxn=100+10;int n,m,x,a[maxn];int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){
cin>>m; for(int i=0;i
>x; a[x]++; } cin>>m; for(int i=0;i
>x; a[x]++; } int ff=1; for(int i=1;i<=n;i++){
if(!a[i]){
ff=0; break; } } if(ff) cout<<"I become the guy."<<"\n"; else cout<<"Oh, my keyboard!"<<"\n"; } return 0;}

J


题目大意

有n团小朋友,每一团都是1-4人,每辆车最多装4人,要你求怎样装才能使车子的数量最少?


题解

采用贪心思想,从大到小先排序,准备一个头指针和一个尾指针,一头一尾,头指向人数较多的一组,尾指向人数较少的一组,如果当前两者相加比4大,说明头的这一组可以单独租一辆车,即cnt++(车辆数加1),i++(头指针往后移一位),尾指针不用处理;

如果当前两者相加和不大于4,即sum<=4,车辆数先加1,同时尾指针往前移一位,因为移后尾指针指向(原来一组的前一组)当前一组的人数可能还可以凑合成一辆车,于是贪心往前,直到大于4为止。

这样当头指针比尾指针还小时,说明已经实现了贪心策略,此时的cnt即为最少车辆数。

#include
using namespace std;const int maxn=1e5+10;int a[maxn],n;int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){
for(int i=0;i
>a[i]; int t=n; int sum=0,cnt=0; sort(a,a+n,greater
()); for(int i=0;i
4) ++cnt; else{
++cnt; --t; while(sum+a[t-1]<=4){
sum+=a[t-1]; --t; } } } cout<
<
学如逆水行舟,不进则退

转载地址:https://chocolate.blog.csdn.net/article/details/100586556 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:2019 ACM训练计划——XXX专题( 每天10题 ) 训练计划模板
下一篇:牛客网(选择困难症)+ 长沙理工大学第十二届ACM大赛 L 选择困难症 (DFS)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月23日 12时29分37秒