牛客周赛Round 132(无F)

ICPC Time

思路:

模拟
代码:

cpp 复制代码
void solve()
{
    int n;
    cin>>n;
    if(n+5>=24)cout<<n+5-24;
    else cout<<n+5;
}

倍数

思路:

检查有没有 5 或者 0。
代码:

cpp 复制代码
void solve()
{
    string n;
    cin>>n;
    for(int i=0;i<n.size();i++){
        if(n[i]=='0'||n[i]=='5'){
            cout<<"YES"<<endl;
            return;
        }
    }
    cout<<"NO"<<endl;
}

邻合

思路:

动态规划,设 dp[i][0] 表示第 i 个数不修改的最小次数,dp[i][1] 表示第 i 个数修改的最小次数。

状态转移方程:
dpi0=min(dpi−10,dpi−10),gcd(ai,ai−1)≠1 dpi0=min(dpi-10,dpi-10),gcd(ai,ai-1)≠1 dpi0=min(dpi−10,dpi−10),gcd(ai,ai−1)=1
dpi1=min(dpi−10,dpi−11)+1 dpi1=min(dpi-10,dpi-11)+1 dpi1=min(dpi−10,dpi−11)+1
dpi0=dpi−11 dpi0=dpi-11 dpi0=dpi−11

还需要特判一下全为 1 的结果。注意这里的 if-else 结构如果当前位置 gcd 为 1 的话,如果当前位置不修改那么只能从上一位置修改转移过来。

🤔并没有验证方法的正确性😄,一步一步试出来的。
代码:

cpp 复制代码
const int N=2e5+5;
int a[N];
int dp[N][2];
void solve()
{
    int n;
    cin>>n;
    memset(dp,0x3f,sizeof dp);
    bool falg=true;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]!=1)falg=false;
    }
    if(falg){
        cout<<n<<endl;
        return;
    }
    int cnt=0;
    dp[1][0]=0;dp[1][1]=1;
    for(int i=2;i<=n;i++)
    {
        if(__gcd(a[i],a[i-1])!=1)dp[i][0]=min(dp[i-1][1],dp[i-1][0]);
        else dp[i][0]=dp[i-1][1];
        dp[i][1]=min(dp[i-1][0],dp[i-1][1])+1;
        
    }
    cout<<min(dp[n][1],dp[n][0])<<endl;
}

补充思路:

看到大神的简单题解了,写一下理解一下。ai=1ai=1ai=1 时是肯定要修改的。当 gcd(ai,ai−1)=1gcd(ai,ai-1)=1gcd(ai,ai−1)=1 时可以贪心将 a[i] 修改为 a[i+1]*a[i-1]。可以直接将这个数字设置成 0,这样之后计算 gcd 时会直接返回另一个数的值。
代码:

cpp 复制代码
void solve()
{
    int n;
    cin>>n;
    memset(dp,0x3f,sizeof dp);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        if(__gcd(a[i],a[i-1])==1)ans++,a[i]=0;
    }
    cout<<ans<<endl;
}

对和

思路:

模拟一下可以看出来,每个数字都会被计算 (n−1)(n-1)(n−1) 次,之后就是要处理下取整的问题,当和为奇数时就会进行下取整,即 (a+b−1)/2(a+b-1)/2(a+b−1)/2 的操作,那么统计有多少个奇数、偶数,然后进行组合一共有 i∗ji*ji∗j 组,然后计算。
代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
const int N=2e5+5;
int a[N];
void solve()
{
    int n;
    cin>>n;
    int sum=0;
    int cnt=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i]*(n-1);
        if(a[i]%2)cnt++;
    }
    int ans=sum-cnt*(n-cnt);
    cout<<ans/2<<endl;
}
signed main(){
	IOS
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
}

镜像

思路:

本质是最短路。

先来明确一下,只有个位不为 0 时才能反转,反转不会改变位数。

首先先来检测一下 a 是否比 b 大一位。如果大的话输出 -1

之后使用队列维护每一个遇到的值,使用 pair 来存储 {当前值,到达当前值的操作次数}。这样的话可能就会遍历很多,所以能剪枝的尽量剪。
代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define PII pair<int,int>
int a,b,k;
int rev(int x){
    int res=0;
    while(x>0){
        res=x%10+res*10;
        x/=10;
    }
    return res;
}
void solve()
{
    cin>>a>>b>>k;
    if(a==b){
        cout<<"0"<<endl;
        return;
    }
    queue<PII> q;
    q.push({a,0});
    int ans=-1;
    int mx=1;
    while(mx<b)mx*=10;
    if(a>=mx){
        cout<<"-1"<<endl;
        return;
    }
    vector<int> st(mx,0);
    st[a]=1;
    while(!q.empty()){
        auto [x,cnt]=q.front();
        q.pop();
        if(x%10){
            int r=rev(x);
            if(r==b){
                ans=cnt+1;
                break;
            }
            if(r<mx&&!st[r]){
                st[r]=1;
                q.push({r,cnt+1});
            }
        }
        int m=x+k;
        if(m==b){
            ans=cnt+1;
            break;
        }
        if(m<mx&&!st[m]){
            st[m]=1;
            q.push({m,cnt+1});
        }
    }
    cout<<ans<<endl;
}
signed main(){
	IOS
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
}
相关推荐
一个王同学9 分钟前
从零到一 | CV转多模态大模型 | week17 | LLM 推理优化 & vLLM 详解
人工智能·深度学习·算法·机器学习·计算机视觉·vllm
旖-旎1 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
变量未定义~2 小时前
单调栈+倍增思想 皇家守卫【算法赛】、单调队列 附近最小
算法
QN1幻化引擎2 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
拂拉氏2 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树
可靠的仙人掌3 小时前
SAC(Soft Actor-Critic)算法底座
开发语言·算法·php
c238563 小时前
《动态规划:从“傻傻穷举”到“过目不忘”的修仙之路》
c++·算法·动态规划
海石4 小时前
单调栈复健,顺便,牺牲一下吧,空间复杂度!一切献给AC
算法·leetcode
海石4 小时前
JS击败94%,Hard题想不到动态规划,那就用数组和栈试试
算法·leetcode
alphaTao6 小时前
LeetCode 每日一题 2026/7/6-2026/7/12
算法·leetcode