2 2 6 08:00 09:00 5 08:59 09:59 2 6 08:00 09:00 5 09:00 10:00
11 6
//640MS 296K
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#pragma comment(linker, "/STACK:1024000000");
#define M 100007
#define inf 0x3f3f3f3f
#define ll long long
#define mod 1000000009
#define eps (1e-8)
using namespace std;
int ans[1500];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(ans,0,sizeof(ans));
int n,num,s_hour,s_minute,e_hour,e_minute,minn=inf,maxx=-1,count=-1;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d:%d%d:%d",&num,&s_hour,&s_minute,&e_hour,&e_minute);
int l=s_hour*60+s_minute;
int r=e_hour*60+e_minute;
if(l<minn)minn=l;
if(r>maxx)maxx=r;
for(int j=l;j<r;j++)
ans[j]+=num;
}
for(int i=minn;i<=maxx;i++)
if(ans[i]>count)count=ans[i];
printf("%d\n",count);
}
return 0;
}2 2 1000 0 0 2000 1000 1000 0 2000 0 0 1000 0 0 2000 1000
2 impossible
推断三点是否一条直线,能够用叉积推断。
//171MS 4320K
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
#define M 1017
#define inf 0x3f3f3f3f
#define ll long long
#pragma comment(linker, "/STACK:1024000000");
using namespace std;
int t,n;
long long l;
int s,e,num=0;
int dist[M] ,vis[M] ,head[1001005];
struct sa
{
int id;
long long x,y;
}node[M] ;
struct E
{
int v,next,cap;
}Edge[1001005];
void addEdge(int u,int v,int c)
{
Edge[num].v=v;Edge[num].cap=c;
Edge[num].next=head[u];
head[u]=num++;
}
int cmp(sa a,sa b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
long long judge(long long a,long long b)
{
long long x=(node[a] .x-node[b] .x)*(node[a] .x-node[b] .x);
long long y=(node[a] .y-node[b] .y)*(node[a] .y-node[b] .y);
long long len=l*l;
return x+y;
}
void SPFA() // 源点为0,汇点为sink。
{
queue<int>q;
for(int i=0;i<n;i++)dist[i]=inf;
q.push(s);
dist[s] = 0;
vis[s] =1;
while(!q.empty()) // 这里最好用队列。有广搜的意思,堆栈像深搜。
{
int u =q.front();
q.pop();vis[u]=0;
for(int i=head[u]; i!=-1;i=Edge[i].next)
{
int v=Edge[i].v;
if(dist[v]>dist[u]+1)
{
dist[v]=dist[u]+1;
if(!vis[v])
{
q.push(v);
vis[v]=true;
}
}
}
}
}
bool cha(int i,int j,int k)
{
int x1=node[i] .x-node[j] .x;
int x2=node[j] .x-node[k] .x;
int y1=node[i] .y-node[j] .y;
int y2=node[j] .y-node[k] .y;
if(x1*y2-x2*y1)return true;
return false;
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(head,-1,sizeof(head));
num=0;
scanf("%d%I64d",&n,&l);
n+=2;
for(int i=0;i<n;i++)
{
scanf("%d%d",&node[i] .x,&node[i] .y);
node[i] .id=i;
}
sort(node,node+n,cmp);
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(judge(i,j)<=l*l)
{
int flag=1;
for(int k=i+1;k<j;k++)
if(!cha(i,j,k)){flag=0;break;}
if(flag){addEdge(i,j,1);addEdge(j,i,1);}
}
for(int i=0;i<n;i++)
{
if(node[i].id==0)s=i;
if(node[i].id==1)e=i;
}
SPFA();
if(dist[e] ==inf)printf("impossible\n");
else printf("%d\n",dist[e] -1);
}
return 0;
}
原文:http://www.cnblogs.com/ljbguanli/p/7081969.html