【题解】城市路站

题目描述

       在A,B两个城市之间蛇油N个路站(如图中的S1,且N≤10),城市与路站之间、路站和路站之间各有若干条路段(各路段数≤10,且每条路段上的距离均为一个整数)。A,B的一条通路是指:从A出发,可经过任一路段到达S1,再从S1出发经过任一路段......最后到达B。通路上路段距离之和称为通路距离(最大距离≤1000)。当所有的路段距离给出之后,求出所有不同距离的通路个数。(相同距离仅记一次)。例如,图中所示是当N=1时的情况。

        从A到B的通路条数为6,但因其中通路5+5=4+6,所以满足条件的不同距离的通路条数为5。

【题解】城市路站

 

输入输出格式

输入格式

        第一行一个整数n,代表从A到第一个路站;第二行为到第一个路站的通路条数r;

        随后的r行代表从A到第一个路站,每一条通路的通路距离;

        如此类推。详情参考输入样例。

 

输出格式

        一行,为满足条件的不同距离的通路条数。

 

输入输出样例

输入样例

1

3 //从A到第一个路站有3条通路

5

7

4

2 //第一个路站到B有2条通路

6

5

 

输出样例

5

 

题解

         暴力枚举每两个车站之间的通道,去重即可。(话说这种枚举方式好像叫二进制枚举)

【题解】城市路站
#include <iostream>

using namespace std;

int n;
int tmp;
int road[15][15];
int stop[15];
int snum[15] = {1};
int differ[1005];
int ans;

int main()
{
    cin >> n;
    ++n;
    for(register int i = 1; i <=n; ++i)
    {
        cin >> snum[i];
        for(register int j = 1; j <= snum[i]; ++j)
        {
            cin >> road[i][j];
        }
    }
    for(register int i = 1; i <= n; ++i)
    {
        tmp += road[i][1];
        stop[i] = 1;
    }
    
    while(!stop[0])
    {
        if(!differ[tmp])
        {
            ++ans;
            differ[tmp]=1;
        }
        tmp -= road[n][stop[n]];
        tmp += road[n][++stop[n]];
        for(register int i = n; i; --i)
        {
            if(stop[i] > snum[i])
            {
                stop[i] = 1;
                tmp += road[i][stop[i]];
                tmp -= road[i - 1][stop[i - 1]];
                tmp += road[i - 1][++stop[i - 1]];
            }
            else break;
        }
    }
    cout << ans;
    return 0;
}
参考程序

 

上一篇:挑战程序设计竞赛2.3习题:Making the Grade POJ - 3666


下一篇:Gym - 101490F:Endless Turning (半平面交)