• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

COCI 2017-2018#7 - Go

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Solution

真的不会证这个的时间复杂度。。。

这道题有一个很关键的一点:当你向右或向左走时,中间的格子都会捉精灵。于是我们向右或向左时枚举步数从小到大,找到一个可以直接 \(break\) 掉,由下一个状态来扩展。

Code

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

int n, m, k, ans;
bool vis[105];
struct node {int id, v, t;} s[105];

bool cmp(const node a, const node b) {return a.id < b.id;}

int read() {
    int x = 0, f = 1; char s;
    while((s = getchar()) < \'0\' || s > \'9\') if(s == \'-\') f = -1;
    while(s >= \'0\' && s <= \'9\') {x = (x << 1) + (x << 3) + (s ^ 48); s = getchar();}
    return x * f;
}

void dfs(const int dir, const int cur, const int sum, const int ti) {
    ans = max(ans, sum);
    for(int i = cur + dir; ~i && i <= m; i += dir)
        if(! vis[i] && abs(s[i].id - s[cur].id) + ti < s[i].t) {
            vis[i] = 1;
            dfs(1, i, sum + s[i].v, ti + abs(s[i].id - s[cur].id));
            dfs(-1, i, sum + s[i].v, ti + abs(s[i].id - s[cur].id));
            vis[i] = 0;
            break;
        }
}

int main() {
    n = read(), s[0].id = k = read(), m = read();
    for(int i = 1; i <= m; ++ i) s[i].id = read(), s[i].v = read(), s[i].t = read();
    sort(s, s + m + 1, cmp);
    for(int i = 0; i <= m; ++ i)
        if(s[i].id == k) {dfs(1, i, 0, 0); dfs(-1, i, 0, 0); break;}
    printf("%d\n", ans);
    return 0;
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go发送邮件发布时间:2022-07-10
下一篇:
Go实现WebSocket案例发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap