HDU 3700 Cat 징 그 러 운 시 뮬 레이 션 문제

2865 단어 struct
Problem Address:http://acm.hdu.edu.cn/showproblem.php?pid=3700
【 머리말 】
마침내 또 하나의 징 그 러 운 시 뮬 레이 션 문 제 를 풀 었 다.
아무래도 HDU 징 그 러 운 문제 가 많은 것 같 습 니 다.
[사고방식]
한 번 스 캔 하고 b 보다 시간 대가 있 으 면 No 를 출력 합 니 다.시간 대 는 겹 치지 않 는 다.그 러 니까 시간 대별 로 정렬 해.
간격 이 a 보다 크 면 먼저 쉰다.휴식 시간 대 를 기록 하 다.
그렇지 않 으 면 다음 시간 을 현재 시간 대로 합 친다.
동시에 현재 시간 대가 b 보다 큰 지 여 부 를 판단 하면 출력 No 입 니 다.
만약 에 마지막 시간 대의 끝 시간 과 첫 번 째 시간의 시작 시간의 간격 이 a 보다 크 면 분할 할 수 있다 는 것 을 의미한다.
그렇지 않 으 면 현재 시간 대 를 첫 번 째 시간 대 앞 에 연결 할 수 있 는 지 확인 해 야 합 니 다.
휴식 시간 대 에 밤 을 넘 기 면 바로 출력 합 니 다. 예 를 들 어 23: 00 - 1: 00 (두 단락 으로 나 누 어 쓸 필요 가 없습니다).
휴식 시간 이 없 으 면 No 를 출력 해 야 합 니 다.
【 코드 】
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

const int maxn = 20;
const int day = 24*60;

struct node
{
    int s;
    int e;
}pt[maxn+5];

vector<node>v;

bool cmp(const node &a, const node &b)
{
    return a.s<b.s;
}

void show(node temp)
{
    printf("%d%d:%d%d-%d%d:%d%d
", temp.s/600, temp.s/60%10, temp.s%60/10, temp.s%10, temp.e/600, temp.e/60%10, temp.e%60/10, temp.e%10); } int main() { int a, b; int n; int i; bool fail; char str[20]; node temp, x; while(scanf("%d %d", &a, &b)!=EOF) { a *= 60; b *= 60; scanf("%d", &n); for (i=1; i<=n; i++) { scanf("%s", str); pt[i].s = (str[0]-'0')*600+(str[1]-'0')*60+(str[3]-'0')*10+(str[4]-'0'); pt[i].e = (str[6]-'0')*600+(str[7]-'0')*60+(str[9]-'0')*10+(str[10]-'0'); if (pt[i].e<pt[i].s) pt[i].e += day; } sort(pt+1, pt+n+1, cmp); v.clear(); fail = false; for (i=1; i<=n; i++) { if (pt[i].e-pt[i].s+1>b) { fail = true; break; } } if (!fail) { temp.s = pt[1].s; temp.e = pt[1].e; for (i=1; i<n; i++) { if (pt[i+1].s-1-temp.e>=a) { x.s = temp.e+1; x.e = pt[i+1].s-1; if (x.s!=x.e) v.push_back(x); temp.s = pt[i+1].s; temp.e = pt[i+1].e; } else { temp.e = pt[i+1].e; if (temp.e-temp.s+1>b) { fail = true; break; } } } } if (!fail) { if (pt[1].s+day-1-temp.e>=a) { x.s = (temp.e+1)%day; x.e = (pt[1].s-1+day)%day; if (x.s!=x.e) v.push_back(x); } else if (v.size()>0 && (v[1].s-1+day)%day-temp.s+1<=b) { } else fail = true; } if (fail || v.size()==0) printf("No
"); else { printf("Yes
%d
", v.size()); sort(v.begin(), v.end(), cmp); for (i=0; i<v.size(); i++) show(v[i]); } } return 0; }
【 코드 】
더러 운 시 뮬 레이 션 문 제 를 계속 찾 아 봐...

좋은 웹페이지 즐겨찾기