题解 | #2023周赛Round26#

A-小红的整数操作

这题似乎测试数据没有题目看起来的大

对取模的简单考察:

每个数在取模K后的余数相同,那么通过n次加K后,必定可以相同。

通过X = k * n1 + b-----------Y = k * n2 + b容易得出;

#include <bits/stdc++.h>
using namespace std;
#define LF(x) fixed<<setprecision(x)
#define ios ios::sync_with_stdio(false)
#define endl '\n'
typedef long long ll;
const int N = 1e5 + 10, M = 2e1 + 8;
const int mod = 10;

int a[N];

int main()
{
    int n, k, maxn = 0, ans = 0;
    cin >> n >> k;
    for (int i = 0; i < n; i ++)
    {
        cin >> a[i];
        a[i] %= k;//取模操作
    }
    sort(a, a + n);
  //统计相同的模的元素数最大值
    for(int i = 0;  i < n - 1; i ++)
    {
        if(a[i] == a[i + 1]) ans ++;
        else ans = 0;
        maxn = max(maxn, ans);
    }
    cout << maxn + 1<< endl;

    return 0;
}

B-小红的01串

  1. 在遇到相邻两个不是同一个字符的区段。
  2. 可以看作2个‘0’与‘1’交换,相当于冒泡排序, 先把‘0’和‘1’放到一起。
  3. 之后发现在‘0’或者‘1’只要有一个是偶数时
  4. 就可以把是偶数个数的‘1’串转化成全是‘0’串或者把是偶数的‘1’串全部转化成‘0’串
#include <bits/stdc++.h>
using namespace std;

string s;

int main()
{
    int q, a[2];
    cin >> q;
    while(q --)
    {
        a[0] = a[1] = 0;//用于统计‘0’ or '1'的个数
        cin >> s;
        for(int i = 0; i < s.length(); i ++)
            a[s[i] - '0'] ++;//计数
        if(a[0] % 2 == 0 || a[1] % 2 == 0)
            cout << "Yes" << endl;
        else
          cout << "No" << endl;    
    }

    return 0;
}

C-小红闯沼泽地

题目注意:

小红只能向左,向下, 向右走。进入不同的地形花费时间为 2。

做题思路:动态规划

除边界外方格可有三种状态得来向左的状态转移过来,向下的状态转移过来, 向右的状态转移过来

我就是没有考虑到向左走

alt

#include <bits/stdc++.h>
using namespace std;
#define LF(x) fixed<<setprecision(x)
#define ios ios::sync_with_stdio(false)
#define endl '\n'
typedef long long ll;
const int N = 2e3 + 10, M = 2e1 + 8;
const int mod = 10;
// setw(n) setfill('0') ## Add leading '0'
//===================================================
int n,m;
bool mp[N][N];//储存平地,沼泽地图
int dp[N][N];//动态规划所用
//===================================================

//===================================================
int main()
{
    ios;
    cin >> n >> m;
    for(int i = 1; i <= n ; i ++)
        for(int j = 1; j <= m; j++)
            cin >> mp[i][j];//输入
  //两者均可预处理数组
    fill(dp[0], dp[0] + N*N, 1e5);
    // memset(f, 0x7f, sizeof(f));
    dp[1][1] = 0;
    for(int i = 1; i <= n; i ++)
    {
      //向下,向右的状态转移
        for(int j = 1; j <= m; j ++)
        {
          //向下的状态转移
            if(mp[i][j] == mp[i - 1][j])//地形相同
                dp[i][j] = min(dp[i][j], dp[i - 1][j] + 1);
            else//地形不同
                dp[i][j] = min(dp[i][j], dp[i - 1][j] + 2);
          //向右的状态转移
            if(mp[i][j] == mp[i][j - 1])//地形相同
                dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1);
            else//地形不同
                dp[i][j] = min(dp[i][j], dp[i][j - 1] + 2);
        }
        for(int j = m; j >= 1; j --)
        {
          //向左的状态转移
            if(mp[i][j] == mp[i][j + 1])//地形相同
                dp[i][j] = min(dp[i][j], dp[i][j + 1] + 1);
            else//地形不同
                dp[i][j] = min(dp[i][j], dp[i][j + 1] + 2);
        }
    }
    cout << dp[n][m] << endl;//输出

    return 0;
}

参考代码----牛客:Xhesica_Frost逍遥人

D-小红的漂亮串(二)

思路

根据正难则反的原则,反向考虑。漂亮串的总数 = 总的方案数-没有red的方案数-只有一个red的方案数

依旧dp(动态规划)

1. 没有red的方案数

  • dp[i][1]:长度为i,以“r”结尾的方案数
  • dp[i][2]:长度为i,以“e”结尾的方案数
  • dp[i][0]:长度为i,以“d”结尾的方案数
  • dp[i][0]:长度为i,以其他字母结尾的方案数
  • 没有red的方案数为 = dp[n][0] + dp[n][1] + dp[n][2] + dp[n][3]

可以得到状态转移公式 alt

2. 只有一个red的方案

  • 可以由没有red的方案数得出
  • 确定red的位置,前后的方案数相乘,再枚举出red可能的每一个位置,将得出的乘积相加

3.总的方案数

  • 总的方案数 =

具体请看代码部分

#include <bits/stdc++.h>
using namespace std;
#define LF(x) fixed<<setprecision(x)
#define ios ios::sync_with_stdio(false)
#define endl '\n'
typedef long long ll;
const int N = 1e6 + 10, M = 2e1 + 8;
const int mod = 1e9 + 7;
// setw(n) setfill('0') ## Add leading '0'
//===================================================
ll dp[N][4];
//===================================================
void init(int n)
{
    dp[1][0] = 23;
    dp[1][1] = dp[1][2] = dp[1][3] = 1;
    dp[2][1] = 26;
    for(int i = 2; i <= n; i ++)
    {
        ll temp = (dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][3]) % mod;
        dp[i][0] = 23 * temp % mod;
        dp[i][1] = temp;
        dp[i][2] = temp;
        dp[i][3] = ((temp - dp[i - 2][1]) % mod + mod) % mod;
    }
}
//快速幂,这题也可直接循环求出26^n,不会TLE
ll quick_pow(ll base, ll power)
{
    ll result = 1;
    while(power > 0)
    {
        if (power & 1)
            result = result * base % mod;
        power >>= 1;
        base = (base * base) % mod;
    }
    return result;
}
//===================================================
int main()
{
    int n;
    ll ans, left, right;
    ios;
    cin >> n;
    ans = quick_pow(26, n);//通过快速幂求得总方案数
    init(n);//状态转移,预处理
    //先减去没有red的情况
    ans = (ans - (dp[n][0] + dp[n][1] + dp[n][2] + dp[n][3]) % mod + mod) % mod;
    //枚举只有一个res时的每个位置的方案数,并减去
    for(int i = 1; i <= n - 2; i ++)
    {
        left = (dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][3]) % mod;
        //防止前面的方案数为0的情况导致乘积为0
        left = max(left, 1ll);
        right = dp[n - i - 2][0] + dp[n - i - 2][1] + dp[n - i - 2][2] + dp[n - i - 2][3];
        //防止后面的方案数为0的情况导致乘积为0
        right = max(right, 1ll);
        //防止成为负号
        ans = (ans - left * right % mod + mod) % mod;
    }

    cout << ans << endl;

    return 0;
}
牛客周赛题解 便于查看 文章被收录于专栏

方便本人自己查看复习知识点。

全部评论

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器-&gt;这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题-&gt;后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务