• vijos p1341【旅行】


     

    描述

      某趟列车的最大载客容量为V人,沿途共有n个停靠站,其中始发站为第1站,终点站为第n站。在第1站至第n-1站之
    间,共有m个团队申请购票搭乘,若规定:(1)对于某个团队的购票申请,要么全部满足,要么全部拒绝,即不允
    许只满足部分。(2)每个乘客的搭乘费用为其所乘站数。

    题目

      应如何选择这些购票申请,能使该趟列车获得最大的搭乘费用?其中,每个团队的购票申请格式是以空格分隔的三个整数:a  b  t,即表示有t个人需要从第a站点乘至第b站点(注:每个团队的所有人员都必须同时在a站上车,且必须同时在后面的b站下车)。

    输入输出格式

    输入

    有若干行。其中:
    第1行只有三个整数n,m,v,分别表示站点数、申请数、列车的最大载客容量。
    这三个整数之间都以一个空格分隔。
    第2行至第m+1行,每行有三个整数,中间都以一个空格分隔。
    其中第k+1行的三个整数a,b,t表示第k个申请,含义为:有t个人需要从第a站乘至第b站。
    数据约定

    1≤n≤10;1≤m≤18,1<=V<=200

    输出

    只有一行,该行只有一个整数,为该列车能获得的最大搭乘费用。

    输入输出样例

    输入样例1

     

    3 3 5
    1 2 2
    2 3 5
    1 3 4

    输出样例1

     

    8
    //当只选择第3个申请时,能获得的最大搭乘费用为(3-1)*4=8
    

    解题思路

    我搜索的是每一个团队的取或者不取,并计算出此种结果的每一站的乘客增减人数,判断是否超载,如果没有,就计算价值,再做比较,是一道回溯DFS.

    题解

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,v,maxx;
    bool sta[100];//车站的选择 
    int a[101],b[101],t[101],w[101];
    bool check()
    {
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            ans+=w[i];//每一站的人数变化后都没有超载就返回true 
            if(ans>v)return false;
        }
        return true;
    }
    void dfs(int dep)
    {
        if(dep==m+1)//如果所有团枚举完了 
        {
            memset(w,0,sizeof(w));//清空 
            int sum=0;//价值 
            for(int i=1;i<=m;i++)
            {
                if(sta[i])//选择了 
                {
                    w[a[i]]+=t[i];//起始站的人数加 
                    w[b[i]]-=t[i];//终点站人下车 
                    sum+=(b[i]-a[i])*t[i]; //价值增加 
                }
            }
            if(check())maxx=max(sum,maxx);//途中没有超载就取大值 
            return;
        }
        //不选择的情况 
        dfs(dep+1);
        
        sta[dep]=true;//选择打上标记 
        dfs(dep+1);//取消标记,回溯操作 
        sta[dep]=false;
        return;
    }
    int main()
    {
        cin>>n>>m>>v;//输入站数,团数,载客量 
        for(int i=1;i<=m;i++)
        {
            cin>>a[i]>>b[i]>>t[i];//起点,终点,人数 
        }
        dfs(1);//从第一个团开始 
        cout<<maxx;
        return 0; 
    }

     

  • 相关阅读:
    vs2022 搭建NET6 WebApi 接口项目《五》 接口访问限流配置
    vs2022 搭建NET6 WebApi 接口项目《二》 配置swagger
    vs2022 搭建NET6 WebApi 接口项目《一》 整体项目搭建
    vs2022 搭建NET6 WebApi 接口项目《六》 返回参数配置
    vs2022 搭建NET6 WebApi 接口项目《三》 配置跨域
    Docker 在mac上的使用
    构建煤矿物联网大数据平台思路(1)
    构建煤矿物联网大数据平台思路(2)实时数据库与时序数据库
    Redis 只能通过127.0.0.1访问,磁盘在使用中等问题...
    git 提交忽略bin obj等文件
  • 原文地址:https://www.cnblogs.com/hualian/p/11147563.html
Copyright © 2020-2023  润新知