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 $。

整个假期期间,他每天只可能有三种选择:

  1. 去健身房健身一整天。(前提是当天健身房开放)
  2. 去图书馆看书一整天。(前提是当天图书馆开放)
  3. 在家休息一整天。

用一个长度为 $ 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;
}

posted @ 2023-02-07 15:46  勇敢龙龙  阅读(36)  评论(0)    收藏  举报