首页 > 其他分享 >【题解】2024牛客多校第5场

【题解】2024牛客多校第5场

时间:2024-07-30 22:25:36浏览次数:7  
标签:cout int 题解 ll 多校 long cin 2024 ai

E 安

https://ac.nowcoder.com/acm/contest/81600/E

分析

简单博弈 / 思维题。

ai > bi 时,当前骑士一定存活。

ai < bi 时,当前骑士一定死亡。

为了使得自己存活的骑士尽可能多,若存在 ai = bi 的情况,一定会选择令该骑士去攻击对方,并且双方均会轮流优先选择此类骑士。

因此,记 ai > bi 的个数为aa,ai = bi 的个数为bb,则最终存活的棋子即为

a a + ⌈ b b 2 ⌉ aa + \lceil\frac{bb} {2} \rceil aa+⌈2bb​⌉

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef long long ll;
const ll mod = 998244353;
const int N = 1e5 + 7;

int n;
int a[N],b[N];

void solve(){
    cin >> n;
    for(int i = 1;i <= n;i++) cin >> a[i];
    for(int i = 1;i <= n;i++) cin >> b[i];

    int aa = 0,bb = 0;
    for(int i = 1;i <= n;i++){
        if(a[i] > b[i]) aa++;
        else if(a[i] == b[i]) bb++;
    }

    cout << aa + (bb + 1) / 2 << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int T;
    cin >> T;
    while (T--)
    {
        solve();
    }

    return 0;
}

B 珑

https://ac.nowcoder.com/acm/contest/81600/B

分析

多米诺骨牌经典问题。

在这里插入图片描述

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef long long ll;
const ll mod = 998244353;
const int N = 1e5 + 7;

int n,m,a,b;

void solve(){
    cin >> n >> m >> a >> b;

    if((n == 1 && m == 2) || (n == 2 && m == 1)){
        cout << "Yes\n";
        return ;
    }

    if((n & 1) && (m & 1)) cout << "No\n";
    else if(b == 1){
        if(a == 1) cout << "Yes\n";
        else if(n == 1 || m == 1) cout << "No\n";
        else cout << "Yes\n";
    } 
    else if(a == 1){
        if(n == 1 && m % 2 == 0) cout << "Yes\n";
        else if(m == 1 && n % 2 == 0) cout << "Yes\n";
        else cout << "No\n";
    }else{
        if(n == 1 && m == 2) cout << "Yes\n";
        else if(n == 2 && m == 1) cout << "Yes\n";
        else cout << "No\n";
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int T;
    cin >> T;
    while (T--)
    {
        solve();
    }

    return 0;
}

L 知

https://ac.nowcoder.com/acm/contest/81600/L

分析

最终答案即为求 a1 * a2 * a3 * … * an 的最大值。

平均分配原则。

ai < ai+1,则给 ai 增加 1,给 ai+1 减少 1,则答案一定不会变劣。

维护前缀和数组c,对于每个ai,计算出[i,i],[i,i+1],[i,i+2]…[i,n]的平均数的最大值s,
若ai < s,则将ai变为s即可。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef long long ll;
const ll mod = 998244353;
const int N = 1e7 + 7;
ll a[N];
ll c[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int T;
    cin >> T;
    while (T--)
    {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i];
        }
        c[n + 1] = 0;
        for (int i = 1; i <= n; i++)
        {
            c[i] = c[i - 1] + a[i];
        }
        for (int i = 1; i < n; i++)
        {
            ll s = 0;
            for (int j = i + 1; j <= n; j++)
            {
                s = max(s, (a[i] + c[j] - c[i]) / (j - i + 1));
            }
            if (a[i] < s)
            {
                s-=a[i];
                a[i] += s;
                a[i + 1] -= s;
            }
        }
        ll res = 1;
        for (int i = 1; i <= n; i++)
        {
            res *= a[i];
            res %= mod;
           // cout << a[i] << ' ';
        }
        cout << res << '\n';
    }

    return 0;
}

H 入

https://ac.nowcoder.com/acm/contest/81600/H

分析

考虑若每个点只连了一条边,那么最终的方案数只有1个,即走完这条链。

若每个点连了两条边或者更多,每个点连的所有边只有一条会起作用,因此实际起作用的点不用超过n/2,所以直接爆搜,状态数也不会超过2^20约1e6。

注意爆搜时进行记忆化,可以结合状压dp来写,总时间复杂度约 O ( n ∗ 2 n ) O(n * 2^n) O(n∗2n)

代码

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 42;
struct stu1{
    int y,nex;
}e[N*N];
int n,m,lin[N],cnt,ans;
void work(int x,int y){
    e[++cnt]=(stu1){y,lin[x]}; lin[x]=cnt;
}
unordered_map<LL,int> mp[N];
void Get(int dq){
    for(int i=0;i<n;i++) cout<<((dq>>i)&1);
    cout<<endl;
}
int dfs(LL dq1,int x){

    if(mp[x][dq1]) return max(mp[x][dq1],0);

    LL dq2=dq1;
    for(int i=lin[x];i;i=e[i].nex){
        int y=e[i].y;
       
        if(((dq1>>y-1)&1)==0){
            
            dq2|=(1ll<<y-1);
        }
    } //zouguoqu

    for(int i=lin[x];i;i=e[i].nex){
        int y=e[i].y;
        if(((dq1>>y-1)&1)==0){
            //if(x==6) cout<<y<<endl;
            mp[x][dq1]=max(mp[x][dq1],dfs(dq2,y)+1);
        }
    } //zouguoqu
   // Get(dq1); Get(dq2);
    //cout<<mp[dq1]<<' '<<x<<' '<<dq1<<endl;
    if(!mp[x][dq1]) mp[x][dq1]=-1;
    return max(mp[x][dq1],0);
}
int main()
{  
   scanf("%d%d",&n,&m);
    int x,y;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        work(x,y);
        work(y,x);
    }
    for(int i=1;i<=n;i++) ans=max(ans,dfs((1ll<<i-1),i)+1);
    printf("%d",ans);
}

场上就写出来了这4道,持续补题中…

标签:cout,int,题解,ll,多校,long,cin,2024,ai
From: https://blog.csdn.net/qq_73162098/article/details/140805799

相关文章

  • JetBrains全系列 2024.x 官方中文汉化包文件 v241.230
    JetBrains捷克软件开发公司出品的编程语言集成开发环境,专为软件开发软件编程人员制作的各类应用工具箱,如;PHP集成开发工具PHPStorm,Java整合开发工具IntelliJIDEA,Python集成开发工具PyCharm,HTML/CSS/JS开发工具WebStorm,专为Ruby和Rails开发者准备的IDE工具RubyMine,Obje......
  • 07-30 题解
    07-30题解A朴素的想法$dp(i,j,k)$表示考虑到第\(i\)位,前\(i\)位的和为\(j\),第\(i\)位的值为\(k\)然后咋转移?重新定义移动小球的方式:从自己右边的邻居拿过来正数个球拿过来负数个球(即往右边的邻居放正数个球)在第2种操作中,我们拿走的球会被后面放过来......
  • 2024年华为OD机试真题-结队编程 -(C++/Java/python)-OD统一考试(C卷D卷)
     2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】题目描述某部门计划通过结队编程来进行项目开发,已知该部门有N名员工,每个员工有独一无二的职级,每三个员工形成一个小组进行结队编程,结队分组规则如下:从部门中选出序号分别为i、j、k的3名员工,他们的职级分贝为......
  • Luogu P1983 车站分级 题解 [ 绿 ] [ 拓扑排序 ] [ 图论建模 ] [ 虚点 ]
    车站分级:很好的拓扑排序题,细节有点多。图论建模首先观察对于一条线路,我们可以从中直接得到什么信息:假设这条线路的开头为\(st\),结尾为\(ed\),那么在\([st,ed]\)的车站中,没有被选入线路的点一定比选入线路的点的级数至少少\(1\)。对于这一点条件,我们就可以建模了。......
  • 学习的第十二天(2024.7.29)
    1.JavaScriptJavaScript,简称JS注意:js的语言在html页面中写在body中,在</body>这个标签的上部写2.JavaScript的基本语法:1.定义变量:let a=10;varb=20;2.也可以通过let声明对象:let obj={};对象中属性的赋值:obj.name="张三";3.定义常量:varsex="男";obj.name......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(3)1008比特跳跃
    题目大意:给出n个城市m条联通两个城市的无向边,从\(u_i\)到\(v_i\)需要耗费\(t_i\)的时间,你也可以选择进行一次比特跳跃,耗费k*(u|v)的时间思路:不难发现,比特跳跃最多跳跃一次。证明:假设使用两次比特跳跃,a->b,c->d,那么权值为k(a|b+c|d),不如直接从a->d,权值为k(a|d),因为a|b+c|d>......
  • 2024牛客暑期多校训练营5
    Preface坐牢,爽!前期经典屡次被签到腐乳导致罚时爆炸,写完四题后发现排名已经冲刺200+了,再一看后面的题都过的很少跟着榜看了一些题后感觉都不太可做,祁神和徐神一直在讨论J但我一点不想写大分类讨论Counting遂开摆摆到大概三点半的时候发现G题过的队越来越多了,看了眼题意......
  • CF538H Summer Dichotomy 题解
    Description有\(T\)名学生,你要从中选出至少\(t\)人,并将选出的人分成两组,可以有某一组是空的。有\(n\)名老师,每名老师要被分配到两个小组之一,对于第\(i\)名老师,要求所在的小组中的学生人数\(\in[l_i,r_i]\)。此外,有\(m\)对老师不能在同一个小组中。你需要判断能否......
  • SP8099 TABLE - Crash´s number table 题解
    题目传送门前置知识一般的积性函数|数论分块|莫比乌斯反演解法令\(n\lem\)。考虑莫比乌斯反演,推式子,有\(\begin{aligned}&\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\operatorname{lcm}(i,j)\\&=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\frac{ij}{\gcd(i,j)......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(3) 1005 数论
    题意:分析:远看数论题,实则是道数据结构。记\(f_{i}\)表示\(r_{k}=i\)的方案数,\(g_{i}\)表示\(l_{1}=i\)的方案数,那么运用简单容斥,可得:\[ans_{x}=(\sum_{i=1}^{n}f_{i})-((\sum_{i=1}^{x-1}f_{i})+1)\times((\sum_{i=x+1}^{n}g_{i})+1)+1\]先考虑如何计算\(f_{i......