Acwing 周赛88 题解
·A题
题目描述
给定一个整数\(x\),请你找到严格大于\(x\)且各位数字均不相同的最小整数\(y\)。
\(1000 \le x \le 9000\)
做法分析
发现数据范围很小,那么我们可以直接从\(x+1\)进行枚举,同时使用一个 check 函数检查是否满足条件。
代码
#include <bits/stdc++.h>
using namespace std;
int x;
bool check(int a)
{
int num[10];//0-9每一个数字是否出现过
for(int i = 0; i < 10; i++)
num[i] = 0;//初始化全部没出现过
while(a > 0)
{
if(num[a % 10])
return 0;//个位数出现过,返回不成立
num[a % 10]++;
a /= 10;//往后缩一位
}
return 1;//坚持到了最后,说明符合条件
}
int main()
{
scanf("%d", &x);
for(int i = x + 1; ; i++)
{
if(check(i))//如果符合
{
printf("%d", i);
return 0;//输出并返回
}
}
return 0;
}
·B题
题目描述
给定一个平面。
平面中有 n 条与 x 轴平行的有向边,从上到下依次编号为 1 ~ n ,每条边都无限长,且两两不重合。
平面中有 m 条与 y 轴平行的有向边,从左到右依次编号为 1 ∼ m ,每条边都无限长,且两两不重合。
这些边一共有 n × m 个交点。
给定每条边的具体方向,请你判断这 n × m 个交点是否满足:从任意交点出发可以到达任意其它交点。
\(2 \le n,m \le 20\)
做法分析
首先先对样例1进行一个图的画,我们得到下图:

发现一点,其实最终我们需要的就只有围成的一个矩形。
先进行矩形的四个角的讨论,也就是先讲问题简化成只有两条竖线两条横线的情况。只有两种情况能够满足:四条线围成的矩形顺时针或逆时针连通,也就是下图两种情况:

所以我们得到了答案成立的初步条件,即上面的两种情况。
然后发现这两种情况与答案满足是等价的:因为对于任意一个点,我们可以先沿着所在边的方向,到达最外圈,然后就可以通过这一圈到大任意一条边的入口,从而到达任意一点。
代码
#include <bits/stdc++.h>
#define MAXn 50
using namespace std;
int n, m;
char a[MAXn], b[MAXn];
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= m; i++)
cin >> b[i];
if(a[1] == '>' && a[n] == '<' && b[1] == '^' && b[m] == 'v')//顺时针
{
printf("YES\n");
return 0;
}
if(a[1] == '<' && a[n] == '>' && b[1] == 'v' && b[m] == '^')//逆时针
{
printf("YES\n");
return 0;
}
printf("NO\n");//都不符合输出NO
return 0;
}
·C题
题目描述
金明有 n 天假期,编号 1 ∼ n。
整个假期期间,他每天只可能有三种选择:
去健身房健身一整天。(前提是当天健身房开放)
去图书馆看书一整天。(前提是当天图书馆开放)
在家休息一整天。
用一个长度为 n 的整数数组 a1,a2,…,an 来表示这 n 天健身房与图书馆的开放情况,其中:
\(a_i\) 等于 0 表示第 i 天健身房关闭且图书馆关闭。
\(a_i\) 等于 1 表示第 i 天健身房关闭但图书馆开放。
\(a_i\) 等于 2 表示第 i 天健身房开放但图书馆关闭。
\(a_i\) 等于 3 表示第 i 天健身房开放且图书馆开放。
金明希望自己用来休息的天数尽可能少,但是,他一定不会连续两天(或更多天)去健身房健身,也一定不会连续两天(或更多天)去图书馆看书。
请你计算,金明用来休息的最少可能天数。
\(1 \le n \le 100,0 \le a_i \le 3\)
题目分析
一眼的状态机DP。
设f[i][j]表示第 i 天状态是 j 时(0 -- 休息,1 -- 去图书馆, 2 -- 去健身房),前 i 天出去的天数。
当第 i 天在家休息时,f[i][0]继承前一天的最大值即max(f[i - 1][0], f[i - 1][1], f[i - 1][2])。
当第 i 天去图书馆时,f[i][1]是前一天在家休息或去健身和钱两天去图书馆中的最大值再加 1 ,因为这一天出去了,即max(f[i - 1][0], f[i - 2][1], f[i - 1][2])。
当第 i 天去健身房时于去图书馆同理即max(f[i - 1][0], f[i - 1][1], f[i - 2][2])。
这里有一个问题,如果上一天图书馆或健身房不开,这一天的这个状态怎么办呢,我们不用管他,因为没有开放的话就不用更新答案,在下一次使用时就为 0 ,不影响结果
代码
#include <bits/stdc++.h>
using namespace std;
int n;
int a[100], f[100][3];//在家,图书馆,健身房
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d\n", &a[i]);
for(int i = 1; i <= n; i++)
{
f[i][0] = max(max(f[i - 1][0], f[i - 1][1]), f[i - 1][2]);
if(a[i] == 1) f[i][1] = max(max(f[i - 1][0], f[i - 2][1]), f[i - 1][2]) + 1;
if(a[i] == 2) f[i][2] = max(max(f[i - 1][0], f[i - 2][2]), f[i - 1][1]) + 1;
if(a[i] == 3)
{
f[i][1] = max(max(f[i - 1][0], f[i - 2][1]), f[i - 1][2]) + 1;
f[i][2] = max(max(f[i - 1][0], f[i - 2][2]), f[i - 1][1]) + 1;
}
}
printf("%d", n - max(max(f[n][0], f[n][1]), f[n][2]));
return 0;
}
Acwing 周赛88 题解的更多相关文章
- AcWing周赛43
AcWing周赛43 题源:https://www.acwing.com/activity/content/1233/ 4314. 三元组 直接暴力做就是了,我一开始还在找规律..悲 我滴代码 #in ...
- Leetcode 周赛#202 题解
本周的周赛题目质量不是很高,因此只给出最后两题题解(懒). 1552 两球之间的磁力 #二分答案 题目链接 题意 有n个空篮子,第i个篮子位置为position[i],现希望将m个球放到这些空篮子,使 ...
- AcWing周赛44
周赛44 4317. 不同正整数的个数 link:https://www.acwing.com/problem/content/4320/ 我直接set #include <iostream&g ...
- LeetCode(88)题解-- Merge Sorted Array
https://leetcode.com/problems/merge-sorted-array/ 题目: Given two sorted integer arrays nums1 and nums ...
- [NowCoder]牛客OI周赛1 题解
A.分组 首先,认识的人不超过3个,因此不存在无解的方案 考虑直接构造,先把所有点设为1,顺序扫一遍把有问题的点加入队列 每次取队头,将其颜色取反,再更新有问题的点 复杂度:考虑到每个点不会操作2次, ...
- FJUT2019暑假周赛一题解
A.排队问题*-* 题意就是有长度为L的序列,每位的取值可以是'f'或者'm',问不包含'fff'和'fmf'的个数. 打表找规律 不难找出递推公式为F[n] = F[n-1] + F[n-3] + ...
- Acwing P283 多边形 题解
Analysis 总体来说是一个区间DP 此题首先是一个环,要你进行删边操作,剩下的在经过运算得到一个最大值 注意事项: 1.删去一条边,剩下的构成一条线,相当于求此的最大值,经典区间DP该有的样子: ...
- Acwing P284 金字塔 题解
Analysis 一棵树的每颗子树都对应着这棵树 DFS 序的一个区间.本题的序列虽然不是 DFS 序列,但也有该性质.本题中,我们以区间长度作为阶段, F[ l , r ] 表示序列 s[ l ~ ...
- Acwing P277 饼干 题解
每日一题 day20 打卡 Analysis 线型动态规划 读入每个人的贪婪度之后,对其按照从大到小的顺序排序,定义状态f[i][j]为前i个人(排序后)分j个饼干的答案,那么答案为f[n][m],考 ...
- AcWing P379 捉迷藏 题解
Analysis 这道题因为我们要给能到达的两个点都连上,又由于n<=200,所以我们可以用n³的传递闭包来建边,再用匈牙利算法来求二分图最大点独立集. #include<iostream ...
随机推荐
- Centos7 部署Django项目 uwsgi + nginx
启动 首先确保你的django项目是可以在虚拟环境中跑起来的,环境管理窝用的是pyenv,pyenv不知道什么东西的可以参考窝之前写过的Pyenv环境管理的安装文. 项目启动 python manag ...
- 2021-03-27:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。输入:head = 1→2→3→4→5, k = 2,输出:4→5→1→2→3。
2021-03-27:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置.输入:head = 1→2→3→4→5, k = 2,输出:4→5→1→2→3. 福大大 答案20 ...
- 2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分累加和}的最大值是多少? 整个过程要求时间复杂度O(N)。
2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分 ...
- 2021-06-19:交错字符串。 有三个字符串s1,s2,s3。判断s3是否由s1和s2交错组成的。比如s1=“abc“,s2=“123“,s3=“12ab3c“,应该返回true,因为s3去掉12
2021-06-19:交错字符串. 有三个字符串s1,s2,s3.判断s3是否由s1和s2交错组成的.比如s1="abc",s2="123",s3=" ...
- bootstrap treeview基本运用
虽然现在有了很多新的前端框架,但是有的时候我们做一个不需要任何其他js编译环境就可以运行的项目,那还是的使用一些老式技术,接下来就来回顾一些bootstrap treeview + jquery的使用 ...
- bugku_EasyMath
bugku_EasyMath 题目描述 简单的数学题 from Crypto.Util.number import getPrime, bytes_to_long from secret import ...
- K8S 证书详解(认证)
K8S 证书介绍 在 Kube-apiserver 中提供了很多认证方式,其中最常用的就是 TLS 认证,当然也有 BootstrapToken,BasicAuth 认证等,只要有一个认证通过,那么 ...
- FnOnce , FnMut <RUST>
FnOnce 1 #[lang = "fn_once"] 2 #[must_use = "closures are lazy and do nothing unless ...
- [ARM汇编]计算机原理与数制基础—1.1.3 二进制补码
在计算机中,为了表示有符号整数(即正数和负数),通常采用二进制补码表示法.二进制补码不仅可以表示负数,还能简化计算机的加法和减法运算.接下来,我们将介绍二进制补码的概念及其计算方法. 原码.反码和补码 ...
- StencilJs学习之组件装饰器
stenciljs 可以方便的构建交互式组件 支持以下装饰器 component state prop watch method element event listen Component 装饰器 ...