题解 | #D-预知#

彩虹糖的梦

https://ac.nowcoder.com/acm/contest/99458/A

一个问题,按照出题人的题解

void solve(){
    int n;
    cin>>n;
    vector<int>a(n);
    for(int i=0;i<n;i++)cin>>a[i];
    if(n==1){
        cout<<"-1\n";
        return ;
    }
    sort(a.begin(),a.end(),greater<int>());
    int m1=a[0];
    int m2=a[1];
    if(m1==1){
        cout<<0<<"\n";
        return ;
    }
    if(m2==1){
        cout<<m1-1<<"\n";
        return ;
    }
    cout<<m1<<"\n";
}

但实际上,我有一个疑问,预测最多的那一堆的牌,仍是不可行的,见下图 alt

因为我是随机的,有可能我 8 种牌,翻出了 8 张,但这 8 张,恰好是 如此以来,编号是的牌,我还剩下张! 这样,我随机翻牌,如果翻出了张中的张,怎么办?它们都是花色,重复了呀~

对于我的疑问,求解

另外给出了一个我自认为是正确的算法

void solve() {
    int n;
    cin >> n;

    vector<i64> a(n, 0);
    for (auto &x : a) cin >> x;

    if (n == 1) {
        cout << "-1\n";
        return;
    }

    sort(a.begin(), a.end());

    auto check = [&](i64 x) -> bool {
        auto b = a;
        i64 d = x / n, r = x % n;

        for (auto &y : b) y -= d;

        bool ok = true;
        for (auto y : b) {
            if (y >= 2) {
                ok = false;
                break;
            }
        }
        if (ok) return true;
        
        i64 extra = 0;
        for (auto y : b) {
            if (y >= 1) extra += (y - 1);
        }
        if (r >= extra) return true;

        return false;
    };

    i64 l = 0, r = 2e14;
    while (l < r) {
        i64 mid = (l + r) >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }

    i64 ans = l;
    cout << ans << "\n";
}

我的算法思路是,二分翻的张数,然后 check 一下这个 x 可不可行 因为是随机的,check 可行的方案,当且仅当一种花色的牌全部取完,或者是这种花色剩下一张,其他花色都是恰好只剩下一张

然后二分求解

我不知道我这种想法错在哪里,出题人回答一下,谢谢~

全部评论
因为你那两次翻牌不是随机的😢,我赛时也没读对
点赞 回复 分享
发布于 2024-12-29 23:03 广东
如果已经知道了两张不一样的牌,我去翻这两张牌一定不会输。翻牌的最坏情况是我一直在翻的牌都是同一张。
点赞 回复 分享
发布于 2024-12-29 21:49 浙江

相关推荐

03-24 13:24
已编辑
江西农业大学 后端工程师
最近或许大家都听说xxxx厂裁员,无论前端,后端,大数据,测试,运维,人人可危,&nbsp;“前端死了,后端也死了,JAVA崩盘了,你们这群搞大模型的真是码奸”这次AI真的会让我们无路可走吗????????太阳底下已经没有新鲜事了旧的生产力的消失,必然有新的生产力诞生马车夫消失&nbsp;→&nbsp;汽车司机、修车工、石油工业诞生,从业人数是马车夫的百倍手工纺织女工消失&nbsp;→&nbsp;纺织机械工程师、面料设计师诞生,纺织品产量提升百倍2007年苹果开放&nbsp;App&nbsp;Store,&quot;移动端开发者&quot;这个职业压根不存在。八年后,全球应用经济规模突破&nbsp;1000亿美元,凭空诞生了数百万开发者岗位。每一次&quot;这次真的完了...
二十岁的编程男神王大...:那这个时代是什么时代呢? 是全员agent的时代,是前端+AI,后端+AI的时代,AI已经融入了项目生命周期的的每一个角落,那我最近在做的东西举例,检查BUG时,我们会用codex,CC等工具的skill去check,效果好还能直接fix,测试的时候,apifox等工具已经有了AI落地的改造,CI/CD阶段,我们会根据hook去跑AI check脚本,就连不少中间件,也迎来了AI落地的改造,(AI网关,AI在MQ中的运用),都可以去了解下 另外记着,这些东西不是意义,工作只是谋生的一个手段,ai是让开发提效了,但是呢,原先一周的工作流程压缩到了两天内,同时低级的都裁员了,只有高级的去维护,你看似写的大义凛然,或许那天你也会成为你文章里面拒绝往前走的人,你才大二,面对技术有热情是对的
AI求职实录
点赞 评论 收藏
分享
03-06 18:20
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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