列表

详情


QR10. 酒店价格

描述

酒店房间的价格录入是通过时间段来录入的,比如10月1日至10月7日800元,10月8日至10月20日500元,请实现以下函数int[][] merge(int[][] dateRangePrices),输入是某个酒店多个日期段的价格,每个日期段(终止日期大于等于起始日期)和对应的价格使用长度为3的数组来表示,比如[0, 19, 300], [10, 40, 250]分别表示从某天开始第1天到第20天价格都是300,第11天到第41天价格都是250,这些日期端有可能重复,重复的日期的价格以后面的为准, 请以以下规则合并并输出合并结果:
1.相邻两天的价格如果相同,那么这两个日期段应该合并
2.合并的结果应该以起始日期从小到大排序

输入描述

输入数据包括多行,如样例输入所示。

输出描述

输出数据为一行,如样例输出所示

示例1

输入:

1 1 100
2 3 100
4 5 110

输出:

[1, 3, 100],[4, 5, 110]

原站题解

C++ 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2017-10-03

//题意其实是:每次给出L, R, Color表示把[L, R]这个区间涂成Color这个颜色,
//后来的涂色会覆盖之前的颜色。最后按顺序输出所有区间的颜色。
#include <bits/stdc++.h>
using namespace std;
 
typedef pair<int, int> pii;
map<pii, int> mp; //用map维护区间[pii.first, pii.second]及其对应颜色int
typedef map<pii, int>::iterator MIT;
 
int main(){
    int a, b, c;
    while( 3 == scanf("%d%d%d", &a, &b, &c) ){
         
        if(!mp.empty()){ //插入区间[a, b]之前先处理已存在的区间
            MIT it = mp.lower_bound(pii(a, INT_MIN));
            if(it != mp.begin()) --it; //找到第一个可能和[a,b]相交的区间
            while(it != mp.end()){ //向后枚举所有相交的区间,注意这里每个区间只会插入删除一次,不影响复杂度
                if(it->first.first < a ){
                    if( it->first.second >= a ){
                        if(it->first.second <= b) { //左边部分相交的区间,修改它的右端点为a - 1
                            *const_cast<int*>(&(it->first.second)) = a - 1;
                            ++it;
                        }
                        else{   //区间[a,b]被完全包含
                            int tmp = it->first.second;
                            *const_cast<int*>(&(it->first.second)) = a - 1;
                            mp.insert(make_pair(pii(b + 1, tmp), it->second));
                            break;
                        }
                    }
                    else{ //在[a,b]左边(不相交)的区间
                        ++it;
                    }
                }
                else if(a <= it->first.first && it->first.first <= b){
                    if(it->first.second <= b) mp.erase(it++); //被[a,b]完全包含的区间,直接删除
                    else{
                        *const_cast<int*>(&(it->first.first)) = b + 1;  //右边部分相交的区间,修改它的左端点为b + 1
                        break;  //这是最后一个可能相交的区间,跳出
                    }
                }
                else break; //右端点大于b的,都不可能相交
            }
        }
        //插入[a,b]
        mp.insert(make_pair(pii(a, b), c));
    }
    //合并相邻区间输出
    const char* s = "";
    int L , R, C, flag = 0;
    for(MIT it = mp.begin(); it != mp.end(); ++it){
        if(flag && R + 1 == it->first.first && C == it->second){
            R = it->first.second;
        }
        else{
            if(flag)  {
                printf("%s[%d, %d, %d]", s, L, R, C);
                s = ",";
            }
            L = it->first.first;
            R = it->first.second;
            C = it->second;
            flag = 1;
        }
    }
    if(flag) printf("%s[%d, %d, %d]", s, L, R, C);
    return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-09-09

#include <iostream>

using namespace std;



int main()
{
    int dataPrices[10000] = {0};
    int start, end, price;
    while(cin>>start>>end>>price)
    {
    	int min = start, max = end;
        for(int i = start; i <= end; i++)
            dataPrices[i] = price;
        while(cin>>start>>end>>price)
        {
            min = min < start ? min : start;
            max = max > end ? max : end;
            for(int i = start; i <= end; i++)
                dataPrices[i] = price;
        }
        
        int status = 0,p_tmp;
        for(int i = min; i <= max; i++)
        {
            if(status ==0)
            {
                p_tmp = dataPrices[i];
                if(p_tmp !=0)
                {
                    cout<<"["<<i<<", ";
                    status = 1;
                }
            }
            if(p_tmp != dataPrices[i+1]&&p_tmp != 0)
            {
                cout<<i<<", "<<p_tmp<<"]";
                if(i != max)
                    cout<<",";
                status = 0;
            }
        }
    }
    return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-09-05

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int start,end,price;
    vector<int> vprice(10000);
    while(cin >> start >> end >> price)
    {
        for(int i=start;i<=end;++i)
            vprice[i]=price;
        int min=start;
        int max=end;
        while(cin >> start >> end >> price)
        {
            if(min>start)
                min=start;
            if(max<end)
                max=end;
            for(int i=start;i<=end;++i)
                vprice[i]=price;
        }
        cout <<"[" <<min << ',' << ' ';
        for(int i=min+1;i<max;++i)
        {
            if(vprice[i-1]!=vprice[i])
            {
                if(vprice[i-1]!=0)
                    cout << i-1 << ',' << ' ' <<vprice[i-1] << "]"; 
                if(i<max&&vprice[i]!=0)
                {
                    cout <<',' << "[" <<i << ',' << ' ';
                }
            }
        }
        cout<<max<<","<<" "<<vprice[max]<<"]"<<endl;
    }
    return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-08-24

#include <iostream>
#include <vector>
using namespace std;

int main(){
    int start, end, price;
    while(cin>>start>>end>>price){
        vector<int> prices(10000);
        for(int i=start;i<=end;i++){
            prices[i]=price;
        }
        int min=start;
        int max=end;
        while(cin>>start>>end>>price){
            if(start<min)
                min=start;
            if(end>max)
                max=end;
            for(int i=start;i<=end;i++)
                prices[i]=price;       
        }        
        
        cout<<"["<<min<<","<<" ";
        for(int i=min+1;i<=max;i++){
            if(prices[i-1]!=prices[i]){
                if(prices[i-1]!=0){
                    cout<<i-1<<","<<" "<<prices[i-1]<<"]";
                }
                if(i<max&&prices[i]!=0){
                    cout<<","<<"["<<i<<","<<" ";
                }
            }
        }
        cout<<max<<","<<" "<<prices[max]<<"]"<<endl;
      }
      return 0;
}
        
       

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-08-24

#include<bits/stdc++.h> 
using namespace std;

int main()
{
	int start, end, price;
	vector<int> a;
	int maxnum, minnum; 
	while(cin>>start>>end>>price)
	{
		vector<int> b(10005, 0) ;
		for(int i=start; i<=end; i++)
		{
			b[i] = price;
		}
		 minnum=start;
		 maxnum = end;
		while(cin>>start>>end>>price)
		{
			if(minnum>start)
				minnum = start;
			if(maxnum < end)
				maxnum = end;
			for(int i=start; i<=end; i++)
				b[i] = price;
		}
		
		cout<<"["<<minnum<<", ";
		for(int i=minnum+1; i<=maxnum; i++)
		{
			if(b[i] != b[i-1])
			{
				if(b[i-1] !=0)
					cout<<i-1<<", "<<b[i-1]<<"]";
				
				if(i<maxnum && b[i] !=0)
					cout<<",["<<i<<", ";
			}
		}
		cout<<maxnum<<", "<<b[maxnum]<<"]"<<endl;
	}
	
	return 0;
}

上一题