Atcoder beginner contest 175D

本文解析AtCoder比赛中的ABC175 D题,介绍了一种通过寻找循环节来优化暴力解法的策略,特别关注了特殊情况处理,并提供了详细的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://atcoder.jp/contests/abc175/tasks/abc175_d
题目大意:从每个框开始,框上有索引,就得到改框的价值C,框可以移动k次,问从每个框都出发,中途能得到的最大价值。
题解:我们一眼望去就能想到的就是暴力,很明显的就是会t掉,我们注意到n远远小于k,且索引是1到n的排序,很明显一定能得到循环节,且循环节的大小一定小于等于n。
注意点:在计算过程中有一种特殊情况我们需要注意:
循环n次,可能比循环n-1次要差。
然后我们模拟就能愉快的ac了,细节看代码

#include <bits/stdc++.h>

using namespace std;
#define ll long long

const int N=1e6+100;

ll p[N],c[N];

ll vis[6000],g[6000];
ll n,k,step;
void A(int s)
{
     while(1){
        if(vis[s]) return ;
        step++;
        g[step]=g[step-1]+c[p[s]];
        vis[s]=1;
        s=p[s];
     }
}
void solve()
{
   cin>>n>>k;
   for(int i=1;i<=n;i++)
        cin>>p[i];
   for(int i=1;i<=n;i++)
       cin>>c[i];
   ll ans=-1e18;
   for(int i=1;i<=n;i++){
       ll kk=k;
       memset(vis,0,sizeof vis);
       for(int i=1;i<=n;i++) g[i]=-1e18;
       step=0;
       A(i);
       ll ma=g[step];
       for(int i=2;i<=step;i++){
          g[i]=max(g[i],g[i-1]);
       }
       ll ty=kk/step;

       if(ty>=1){
          ans=max(max(ans,g[step]),max(g[kk%step]+ty*ma,g[step]+(ty-1)*ma));
       }
       else {
        ans=max(ans,g[kk%step]);
       }
   }
    cout<<ans<<endl;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    solve();
    return 0;
}

请大佬们多多指教。

回答: AtCoder Beginner Contest 314是一场编程竞赛。根据引用中的代码,这段代码是一个解决一个关于组合问题的程序。它通过深度优先搜索来确定每个人应该被安排在哪个组中。其中,n表示人的数量,T表示组的数量,m表示冲突的对数。程序会根据给定的冲突对来判断是否可以将一个人放入某个组中。如果所有的条件都满足,则输出方案数。根据引用和引用中的代码,我们可以使用不同的方法来解决这个问题。引用中的代码使用了set来维护每个人的出现次数,并按照出现次数之和的降序排列,然后按照顺序将数字放入构建的序列中。而引用中的代码使用了二维数组和vector来实现。不同的组会被存储在一个vector中,然后通过深度优先搜索来确定每个人应该被放置在哪个组中。这两种方法都可以解决问题,具体使用哪一种方法取决于实际需求和个人喜好。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [AtCoder Beginner Contest 310 D](https://blog.youkuaiyun.com/XihuDacuyu/article/details/131749177)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [【解题总结】Atcoder Beginner Contest 汇总](https://blog.youkuaiyun.com/zqy1018/article/details/108167389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值