机房一个同学打的暴力,结果薄纱标程 原题链接:https://www.acwing.com/problem/content/373/ 求巨佬把hack数据甩我脸上 代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=2100;
int n, cnt, t[N]; bool v[N];
struct type{int x, y;} h[N];
struct node{int st, ed, d;} a[N];
bool cmp(type a, type b) {return a.x<b.x;}
void hh(int k, char s[], int w)
{
int h=(s[0]-'0')*10+(s[1]-'0');
int m=(s[3]-'0')*10+(s[4]-'0');
if(w==0) a[k].st=h*60+m; else a[k].ed=h*60+m;
}
bool dfs(int k)
{
if(k==n+1) return true;
bool bk=false;
int f1=(t[a[k].st]>0), f2=(t[a[k].st+a[k].d]>0);
for(int i=a[k].st;i<=a[k].st+a[k].d;i++)
{
if((i==a[k].st&&t[i]==2)||(i==a[k].st+a[k].d&&t[i]==1)) {v[i]=true; continue;}
if(v[i]==true)
{
for(int j=i-1;j>=a[k].st+f1;j--)
v[i]=false; bk=true; break;
}
else v[i]=true;
}
if(!bk)
{
t[a[k].st]=1, t[a[k].st+a[k].d]=2;
h[++cnt]={a[k].st, a[k].st+a[k].d};
if(dfs(k+1)) return true;
else
{
for(int i=a[k].st+f1;i<=a[k].st+a[k].d-f2;i++) v[i]=false;
t[a[k].st]=f1, t[a[k].st+a[k].d]=f2;
}
}
f1=(t[a[k].ed-a[k].d]>0), f2=(t[a[k].ed]>0);
for(int i=a[k].ed-a[k].d;i<=a[k].ed;i++)
{
if((i==a[k].ed-a[k].d&&t[i]==2)||(i==a[k].ed&&t[i]==1)) {v[i]=true; continue;}
if(v[i]==true) {for(int j=i-1;j>=a[k].ed-a[k].d+f1;j--) v[i]=false; return false;}
else v[i]=true;
}
t[a[k].ed]=2, t[a[k].ed-a[k].d]=1;
h[++cnt]={a[k].ed-a[k].d, a[k].ed};
if(dfs(k+1)) return true;
else
{
t[a[k].ed]=f2, t[a[k].ed-a[k].d]=f1;
for(int i=a[k].ed-a[k].d+f1;i<=a[k].ed-f2;i++) v[i]=false;
}
return false;
}
int main()
{
cnt=0; scanf("%d", &n);
for(int i=1;i<=n;i++)
{
char s1[10], s2[10]; scanf("%s", s1);
scanf("%s", s2); scanf("%d", &a[i].d);
hh(i, s1, 0); hh(i, s2, 1);
}
if(dfs(1))
{
sort(h+1, h+1+n, cmp);
puts("YES");
for(int i=1;i<=n;i++)
{
int x=h[i].x, y=h[i].y;
printf("%02d:%02d %02d:%02d\n",x/60, x%60, y/60, y%60);
}
}
else puts("NO");
return 0;
}