AcWing第88场周赛
下一个
给定一个整数 $ x $,请你找到严格大于 $ x $ 且各位数字均不相同的最小整数 $ y $。
输入格式
一个整数 $ x $。
输出格式
一个整数 $ y $。
保证一定有解。
数据范围
所有测试点满足 $ 1000 \le x \le 9000 $。
输入样例1:
1987
输出样例1:
2013
输入样例2:
2013
输出样例2:
2014
题目思路
简单的枚举即可,对于每个数都判断每一位的出现次数即可
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int a[N];
int n;
bool check(int x)
{
    memset(a,0,sizeof a);  // 对于for循环的每次i都要清空一下
    while (x)
    {
        a[x%10]++;
        if (a[x%10]>1) return false;
        x/=10;
    }
    
    return true;
}
int main()
{
    cin>>n;
    for (int i=n+1;;i++)
    {
        if (check(i))
        {
            cout<<i<<endl;
            return 0;
        }
    }
}
强连通图
给定一个平面。
平面中有 $ n $ 条与 $ x $ 轴平行的有向边,从上到下依次编号为 $ 1 \sim n $,每条边都无限长,且两两不重合。
平面中有 $ m $ 条与 $ y $ 轴平行的有向边,从左到右依次编号为 $ 1 \sim m $,每条边都无限长,且两两不重合。
这些边一共有 $ n \times m $ 个交点。
给定每条边的具体方向,请你判断这 $ n \times m $ 个交点是否满足:从任意交点出发可以到达任意其它交点。
输入格式
第一行包含两个整数 $ n,m $。
第二行包含一个长度为 $ n $,由 < 和 > 构成的字符串,其中第 $ i $ 个字符用来表示第 $ i $ 条与 $ x $ 轴平行的有向边的方向,如果为 < 表示方向从右向左,如果为 > 表示方向从左向右。
第三行包含一个长度为 $ m $,由 ^ 和 v 构成的字符串,其中第 $ i $ 个字符用来表示第 $ i $ 条与 $ y $ 轴平行的有向边的方向,如果为 ^ 表示方向从下向上,如果为 v 表示方向从上向下。
输出格式
如果所有交点满足题目要求,则输出 YES,否则输出 NO。
数据范围
前 $ 5 $ 个测试点满足 $ 2 \le n,m \le 6 $。
所有测试点满足 $ 2 \le n,m \le 20 $。
输入样例1:
3 3
><>
v^v
输出样例1:
NO
输入样例2:
4 6
<><>
v^v^v^
输出样例2:
YES
题目分析
思维题,只需要最外边界构成循环,顺逆时针皆可
由于边界是无线循环的,边界上的点可以到任意边界上的点
边界可以到内层的所有的点,内存必定可以到边界
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m;
string a, b;
int main()
{
    cin >> n >> m >> a >> b;
    if (a[0] == '<' && a[n - 1] == '>' && b[0] == 'v' && b[m - 1] == '^')
        puts("YES");
    else if (a[0] == '>' && a[n - 1] == '<' && b[0] == '^' && b[m - 1] == 'v')
        puts("YES");
    else
        puts("NO");
    return 0;
}
金明的假期
金明有 $ n $ 天假期,编号 $ 1 \sim n $。
整个假期期间,他每天只可能有三种选择:
- 去健身房健身一整天。(前提是当天健身房开放)
- 去图书馆看书一整天。(前提是当天图书馆开放)
- 在家休息一整天。
用一个长度为 $ n $ 的整数数组 $ a_1,a_2,…,a_n $ 来表示这 $ n $ 天健身房与图书馆的开放情况,其中:
- $ a_i $ 等于 $ 0 $ 表示第 $ i $ 天健身房关闭且图书馆关闭。
- $ a_i $ 等于 $ 1 $ 表示第 $ i $ 天健身房关闭但图书馆开放。
- $ a_i $ 等于 $ 2 $ 表示第 $ i $ 天健身房开放但图书馆关闭。
- $ a_i $ 等于 $ 3 $ 表示第 $ i $ 天健身房开放且图书馆开放。
金明希望自己用来休息的天数尽可能少,但是,他一定不会连续两天(或更多天)去健身房健身,也一定不会连续两天(或更多天)去图书馆看书。
请你计算,金明用来休息的最少可能天数。
输入格式
第一行包含一个整数 $ n $。
第二行包含 $ n $ 个整数 $ a_1,a_2,…,a_n $。
输出格式
一个整数,表示金明用来休息的最少可能天数。
数据范围
前 $ 5 $ 个测试点满足 $ 1 \le n \le 10 $。
所有测试点满足 $ 1 \le n \le 100 \(,\) 0 \le a_i \le 3 $。
输入样例1:
4
1 3 2 0
输出样例1:
2
输入样例2:
7
1 3 3 2 1 2 3
输出样例2:
0
输入样例3:
2
2 2
输出样例3:
1
题目分析
f[i][j] 表示前i天,状态为j的最多消耗的(即非休息)的天数,其中j=0,1,2
- 
j=0,对应休息 
- 
j=1,对应去图书馆 
- 
j=2,对应去健身房 f[i][0],表示今天休息,则昨天可以休息,去图书馆,去健身房。 
 即f[i-1][0],f[i-1][1],f[i-1][2] -----> f[i][0]f[i][1],表示今天去图书馆,则昨天可以休息,去健身房 
 f[i-1][0],f[i-1][2] ---> f[i][1]f[i][2],表示今天去健身房,则昨天可以休息,昨天可以去图书馆 
 f[i-1][0],f[i-1][1] ----> f[i][2]
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int f[N][3];
int n;
int a[N];
int main()
{
    cin>>n;
    for (int i=1;i<=n;i++)
        cin>>a[i];
    
    for (int i=1;i<=n;i++)
    {
        // 今天休息---->(昨天休息,昨天图书馆,昨天健身馆)
        f[i][0]=max(f[i-1][0],max(f[i-1][1],f[i-1][2]));
        
        // 今天如果去图书馆---->(昨天图书馆但今天不去,昨天休息,昨天健身房)
        if (a[i]==1||a[i]==3)
            f[i][1]=max(f[i-1][1],max(f[i-1][0],f[i-1][2])+1);
        
        // 今天如果去健身房---->(昨天健身房但今天不去,昨天休息,昨天图书馆)
        if (a[i]==2||a[i]==3)
            f[i][2]=max(f[i-1][2],max(f[i-1][0],f[i-1][1])+1);
            
    }
    
    // 找出前n天活动的最大天数
    int ans = 0;
    for (int i=0;i<=2;i++)
        ans=max(ans,f[n][i]);
    // 总天数-活动的最大天数为最少休息天数
    cout<<n-ans<<endl;
    return 0;
}

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号