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
输入:
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; }