[USACO13OPEN]Luxury River Cruise【模拟】

博客探讨了USACO竞赛中的一道题目,Luxury River Cruise。文章指出解题关键在于理解题目并非总是形成一个完整的环,但至少存在一个环。作者利用visvis数组处理环的起始和结束,并通过邻接表更新答案。在处理大规模kk值时,采取了取模操作,确保计算正确。博客内容包括问题分析、解决方案和代码展示。

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

Pro

Luogu3083

Sol

第一次做的时候没读懂题意,后来以为题目中的数据一定构成一个环,导致 WA W A 。其实不一定全部构成一个环,但是肯定是有环的,否则 k k 这么大的取值范围难道去枚举???先处理出环来,借助vis数组来表示这个环是从哪里开始哪里结束的。然后借助一个类似邻接表的东东,更新答案。对于这么大的 k k ,第一感觉就是取模啦,取模之前一定要减去前面不是环的部分啊,其他……就是模拟了。

Code

#include<iostream>
#include<cstdio>
using namespace std;

int no[1005][2] , f[1005] , vis[1005] , n , m , k , top , now = 1;

int main() {
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1; i<=n; i++)
        scanf("%d%d",&no[i][0],&no[i][1]);
    for(int i=1; i<=m; i++) {
        char ch;
        cin>>ch;
        if(ch == 'R')
            f[i] = 1;
    }
    while(!vis[now]) {
        vis[now] = ++top;
        for(int i=1; i<=m; i++)
            now = no[now][f[i]];
    }
    k -= (vis[now]-1);
    k %= (top-vis[now]+1);
    for(int i=1; i<=k; i++)
        for(int j=1; j<=m; j++)
            now = no[now][f[j]];
    printf("%d",now);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值