UVa 301 - Transportation

题目链接:UVa 301 - Transportation

回溯,注意这个题是一个方向走的,不回头。写了两份代码,第一份WA,换了种思路,第二份AC了,都贴出来,以后再研究研究。

/**
WA
*/
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

const int MAX_N = 22 + 5;
int m,n,c;
struct order
{
    int start,end,num;
};
int cmp(order a,order b)
{
    return a.start < b.start;
}
order o[MAX_N];
int vis[MAX_N];
int _max;

void dfs(int x,int p_num,int money)
{
    int i,j;
    for(i = x;i < n;i++)
    {

        if(i != 0 && o[i-1].start != o[i].start)
        {
            for(j = i - 1;j >= 0;j--)
                if(o[j].end == o[i].start && vis[j])
                    p_num -= o[j].num;//到站了下车
        }
        p_num += o[i].num;
        if(p_num > c)
        {
            p_num -= o[i].num;
            continue;
        }
        money = money + (o[i].end - o[i].start) * o[i].num;//先收钱
        vis[i] = 1;
        dfs(i+1,p_num,money);
        vis[i] = 0;
        p_num -= o[i].num;
        money = money - (o[i].end - o[i].start) * o[i].num;
    }
    if(money > _max)
        _max = money;
}
int main()
{

    while(cin>>c>>m>>n && (c || m || n))
    {
        _max = 0;
        memset(vis,0,sizeof(vis));
        memset(o,0,sizeof(o));
        int i;
        for(i = 0;i < n;i++)
            cin>>o[i].start>>o[i].end>>o[i].num;
        sort(o,o+n,cmp);
        dfs(0,0,0);
        cout<<_max<<endl;
    }
    return 0;
}

/**
AC
*/
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

const int MAX_N = 22 + 5;
const int MAX_M = 7 + 3;
int m,n,c;
struct order
{
    int start,end,num;
};
order o[MAX_N];
int station[MAX_M];
int _max;

void dfs(int x,int money)
{
    int i,j;
    for(i = x;i < n;i++)
    {
        for(j = o[i].start;j < o[i].end;j++)
        {
            station[j] += o[i].num;
            if(station[j] > c)
                break;
        }
        if(j == o[i].end)
        {
            dfs(i+1,money+(o[i].end-o[i].start)*o[i].num);
            j--;
        }
        for(;j >= o[i].start;j--)
            station[j] -= o[i].num;
    }
    if(money > _max)
        _max = money;
}
int main()
{

    while(cin>>c>>m>>n && (c || m || n))
    {
        _max = 0;
        memset(o,0,sizeof(o));
        memset(station,0,sizeof(station));
        int i;
        for(i = 0;i < n;i++)
            cin>>o[i].start>>o[i].end>>o[i].num;
        dfs(0,0);
        cout<<_max<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值