題目LINK
題意解釋
題意是從一個(gè)房子到另一個(gè)房子搬桌子,題意中兩個(gè)搬桌子的進(jìn)程中,如果兩者在使用走廊的過(guò)程中沒(méi)有重疊的部分那么就可以同時(shí)進(jìn)行。這道題整體的思路是imos算法,就是想象一個(gè)軸,軸里有1 2 3 ... n,然后找出每次移動(dòng)桌子的區(qū)間,在用類(lèi)似俄羅斯方塊的方法疊加上去,這道題的最終結(jié)果是疊加后最厚區(qū)間的高度。(建議自行百度1mos算法,十分直觀)
收獲
首先這道題的坑有兩個(gè)。
1.給出的起始點(diǎn)可能小于終點(diǎn) 2.區(qū)間算的時(shí)候,一定是奇數(shù)到偶數(shù),才能做到真正的區(qū)間全覆蓋
代碼技巧
- max_element()這個(gè)在algorithm的頭文件里,非常好用
AC代碼
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef struct member{
int s;
int j;
}member;
member input[200];
void in(int total){
int i = 0;
while(total > 0){
scanf("%d %d",&input[i].s,&input[i].j);
if(input[i].s > input[i].j){
int tmp = input[i].s;
input[i].s = input[i].j;
input[i].j = tmp;
}
if(input[i].j%2 == 1)input[i].j++;//this is a trap
if(input[i].s%2 == 0)input[i].s--;//
total--;
i++;
}
}
void solve(int total){
int i = 0;
int table[400];
int cost = 0;
memset(table,0,sizeof(table));
while(i < total){
for(int j = input[i].s; j <= input[i].j; j ++){
table[j]++;
}
i++;
}
cout << *max_element(table,table + 400)*10 << endl;
}
int main()
{
int t,total;
scanf("%d\n",&t);
while(t > 0){
scanf("%d\n",&total);
in(total);
solve(total);
t--;
}
return 0;
}