Jlh打靶
Jlh喜欢射箭,尤其喜欢射正方形的靶子。在二维坐标里有一个长方形区域表示靶子,有n个点表示jlh射出去的箭,求有多少支箭在靶子上(边缘也算靶子上)。
输入一个T(T<=20)表示有T组数据。第一行输入一个n(n<=100),表示有n支箭,接下来n行输入x,y(|x,y|<100)表示箭的坐标。最后一行输入输入4个坐标(逆时针给出),表示长方形区域。(顺时针给出)
输出有多少支箭在靶子上
2 5 1 1 0 1 2 0 0 2 2 3 0 0 2 0 2 2 0 2 10 2 2 0 4 0 3 1 1 4 3 2 3 2 0 3 1 0 0 4 4 1 0 4 3 3 4 0 1
4 4
#include "string.h"
#include "math.h"
double sfun(double x1,double y1,double x2,double y2,double x3,double y3)
{
double x=((x1*y2-x2*y1)+(x2*y3-x3*y2)+(x3*y1-x1*y3))/2;
return x>0?x:x*(-1.0);
}
int main(void)
{
int m;
scanf("%d",&m);
while(m--)
{
int n,ans=0;
double ss[101][2],label[4][2];
double s;
double sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lf%lf",&ss[i][0],&ss[i][1]);
for(int i=0;i<4;i++)
scanf("%lf%lf",&label[i][0],&label[i][1]);
s=sfun(label[0][0],label[0][1],label[1][0],label[1][1],label[2][0],label[2][1])*2;
for(int i=0;i<n;i++)
{
sum=0;
sum+=sfun(ss[i][0],ss[i][1],label[0][0],label[0][1],label[1][0],label[1][1]);
sum+=sfun(ss[i][0],ss[i][1],label[1][0],label[1][1],label[2][0],label[2][1]);
sum+=sfun(ss[i][0],ss[i][1],label[2][0],label[2][1],label[3][0],label[3][1]);
sum+=sfun(ss[i][0],ss[i][1],label[3][0],label[3][1],label[0][0],label[0][1]);
if(sum==s) ans++;
}
printf("%d\n",ans);
}
}
Jlh找妈妈
Jlh和妈妈去景点玩耍,因为jlh太兴奋,不顾沿途欣赏风景的妈妈,自己不停地往前蹦跶,大概几个小时之后,他终于发现自己迷路了。他十分难过,他找不到妈妈了。与此同时,他的妈妈也发现jlh走丢了,她会在原地等待jlh回来。在某一段时间之后,如果jlh的妈妈没有等到jlh,她会请求警察叔叔的帮助,然而jlh不喜欢见到警察叔叔。就在此时,前方走来了正在思考题目的你,他请求你的帮助,就会希望你能帮助他在他妈妈报警之前找到他的妈妈。
输入有多组数据,每组数据第一行会输入两个正整数n(n<10000),m(m<10000),t(0<n,m<1000),< span="" style="box-sizing: border-box;">分别表示有几个景点,几条通路,以及妈妈等待的最长时间,接下来一行输入两个正整数s,e(0<s,n<10000)< span="" style="box-sizing: border-box;">分别表示jlh妈妈所在的位置以及jlh的位置。再接下来m行,每行都有三个数据,a,b,c(c<100),表示a景点到b景点的距离是c米,假设他们的速度是10m/s。然后,在JLH的世界里,一般的物理公式是不成立的,在这个世界里的正确物理公式是 t(时间)= v(速度)* s(路程)
如果能在规定时间内找到这样一条路经,请输出花费的时间。
如果不能请输出“I am sorry,jlh!”。
3 2 100 1 3 1 2 5 2 3 5 3 2 100 1 3 1 2 6 2 3 5
100 I am sorry,jlh!
#include "string.h"
#define error 999999999
int start,end,pre[10005],dis[10005],cnt,m,n,t;
struct node{
int to,next,v;
}T[20005];
void add(int a,int b,int c)
{
T[cnt].to=b;
T[cnt].v=c;
T[cnt].next=pre[a];
pre[a]=cnt++;
}
void spfa()
{
int vis[10005];
int front=0,last=0,pos;
memset(vis,0,sizeof(vis));
for(int i=0;i<=m;i++)
dis[i]=error;
dis[start]=0;
vis[start]=1;
pos=start;
for(int i=pre[pos];i!=-1;i=T[i].next)
{
int y=T[i].to;
dis[y]=T[i].v;
}
while(1)
{
int min=error;
if(pos==end) return;
for(int i=0;i<=m;i++)
if(!vis[i]&&dis[i]<min) {
min=dis[i];
pos=i;
}
vis[pos]=1;
if(min==error) return;
for(int i=pre[pos];i!=-1;i=T[i].next)
{
int y=T[i].to;
if(!vis[y])
dis[y]=(dis[pos]+T[i].v)<dis[y]?(dis[pos]+T[i].v):dis[y];
}
}
}
int main()
{
while(scanf("%d%d%d",&m,&n,&t)!=EOF)
{
cnt=0;
memset(pre,-1,sizeof(pre));
scanf("%d%d",&start,&end);
for(int i=0;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
spfa();
if(10*dis[end]<=t) printf("%d\n",dis[end]*10);
else printf("I am sorry,jlh!\n");
}
}
理发店奇遇
有一天,你去一家新潮的理发店准备理发。在这家理发店内,理发师的标号从1开始到B。第k位理发师傅总是会话费Mk 分钟来服务一位顾客,并且,每位理发师只能同时服务一位顾客。一旦一位理发师完成了对顾客的服务,他将立即有空去服务其他的顾客。
当理发店开门的时候,聪明的顾客总会选择能让他们尽早离开的理发师。如果找不到有空的理发师,顾客会等待直到有理发师空闲。
你是第N位顾客,此时商店刚刚开门营业,猜猜看哪位你会享受到哪位理发师的服务呢?
输入
第一行输入告诉你有几组样例, T。T组如下。
每组样例中,有由空格分开的两个整数B和N--理发师的数目和你的位置。队伍中第一位顾客的标号是1,第二位是2,按照这个规律。第二行包含了M1, M2, ..., MB.
输出
对于每组样例,输出一行包含 "Case #x: y", x 表示样例的标号(从1开始),y 表示服务你的理发师的标号。
数据规模
1 ≤ T ≤ 100.
1 ≤ N ≤ 109.
1 ≤ B ≤ 1000.
1 ≤ Mk ≤ 100000.
3 2 4 10 5 3 12 7 7 7 3 8 4 2 1
Case #1: 1 Case #2: 3 Case #3: 1
Round 1A, Google code jam 2015
|