| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1007 人关注过本帖
标题:C++Movie
只看楼主 加入收藏
Jason_
Rank: 2
来 自:浙江台州
等 级:论坛游民
帖 子:88
专家分:66
注 册:2019-7-14
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:1 
C++Movie
小A和小B一起去电影院看电影,电影院的座位有N排,编号为1..N,每排有M个座位,编号为1..M,其中有些座位已经有人坐了。他们俩要找两个同一排相邻的两个无人的座位,问有多少个可行方案。
输入
三个整数N,M,K。
以下K行,每行两个数X,Y,表示第X排第Y个座位有人,同一个座位至多只出现一次。
输出
一个数,表示他们俩可以选择的方案数。
样例
输入1  复制
2 3 2
1 2
2 3
输出1  复制
1
输入2  复制
4 7 1
1 1
输出2  复制
23
提示
对于30%的数据,N,M<=100。
对于100%的数据,1<=N,M<=1,000,000,000,1<=K<=47。
搜索更多相关主题的帖子: 输出 C++ 输入 复制 电影 
2020-03-22 10:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:20 
没想出什么好的算法,用的是最普通的方法

程序代码:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <utility>
using namespace std;

struct foo
{
    size_t x, y;

    friend std::istream& operator>> (std::istream& is, foo& obj )
    {
        return is >> obj.x >> obj.y;
    }
    friend bool operator<( const foo& lhs, const foo& rhs ) noexcept
    {
        return std::tie(lhs.x,lhs.y) < std::tie(rhs.x,rhs.y);
    }
    friend size_t bulk( const foo& lhs, const foo& rhs, size_t m ) noexcept
    {
        auto foo = [](size_t delta) { return delta<2 ? 0 : delta-2; };
        return lhs.x==rhs.x ? foo(rhs.y-lhs.y) : foo(m+1-lhs.y) + (rhs.x-lhs.x-1)*(m-1) + foo(rhs.y-0);
    }
};

int main( void )
{
    // 输入
    size_t n,m,k;
    foo s[1+47+1]; // 题目中交代过 1<=K<=47
    cin >> n >> m >> k;
    copy_n( istream_iterator<foo>(cin), k, s+1 );

    // 开始干活
    sort( s+1, s+1+k ); // 题目中没说过一定按照顺序输入
    s[0].x=1, s[0].y=0;
    s[k+1].x=n, s[k+1].y=m+1;
    size_t sum = 0;
    for( size_t i=0; i!=k+1; ++i )
        sum += bulk( s[i], s[i+1], m );

    // 输出
    cout << sum << endl;
}

2020-03-22 14:07
快速回复:C++Movie
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024371 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved