5-28新生赛

Jlh打靶

Time Limit
1s
Memory Limit
32768KB
Judge Program
Standard
Ratio(Solve/Submit)
4.00%(1/25)
Description:

Jlh喜欢射箭,尤其喜欢射正方形的靶子。在二维坐标里有一个长方形区域表示靶子,有n个点表示jlh射出去的箭,求有多少支箭在靶子上(边缘也算靶子上)。

Input:

输入一个T(T<=20)表示有T组数据。第一行输入一个n(n<=100),表示有n支箭,接下来n行输入x,y(|x,y|<100)表示箭的坐标。最后一行输入输入4个坐标(逆时针给出),表示长方形区域。(顺时针给出)

Output:

输出有多少支箭在靶子上

Sample Input:
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
Sample Output:
4
4

这题有不同方法,听了学长的思路,求面积比较简单。
只需该点与矩形四条边构成的四个三角形的面积之和等于矩形的面积即可证明该点在矩形内(包括边框)
AC代码:
#include <stdio.h>
#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);
    }
}

Time Limit
1s
Memory Limit
32768KB
Judge Program
Standard
Ratio(Solve/Submit)
9.09%(2/22)
Description:

Jlh和妈妈去景点玩耍,因为jlh太兴奋,不顾沿途欣赏风景的妈妈,自己不停地往前蹦跶,大概几个小时之后,他终于发现自己迷路了。他十分难过,他找不到妈妈了。与此同时,他的妈妈也发现jlh走丢了,她会在原地等待jlh回来。在某一段时间之后,如果jlh的妈妈没有等到jlh她会请求警察叔叔的帮助,然而jlh不喜欢见到警察叔叔。就在此时,前方走来了正在思考题目的你,他请求你的帮助,就会希望你能帮助他在他妈妈报警之前找到他的妈妈。

Input:

输入有多组数据,每组数据第一行会输入两个正整数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(路程)

Output:

如果能在规定时间内找到这样一条路经,请输出花费的时间。

如果不能请输出“I am sorry,jlh!”

Sample Input:
3 2 100
1 3
1 2 5
2 3 5
3 2 100
1 3
1 2 6
2 3 5
Sample Output:
100
I am sorry,jlh!
题意:求起点到终点的最短路径
这题因为数据比较大得用邻接表来存储,求最短路径即可。

AC代码:
#include "stdio.h"
#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");


}
}

Time Limit
1s
Memory Limit
32768KB
Judge Program
Standard
Ratio(Solve/Submit)
25.00%(5/20)
Description:

有一天,你去一家新潮的理发店准备理发。在这家理发店内,理发师的标号从1开始到B。第k位理发师傅总是会话费Mk 分钟来服务一位顾客,并且,每位理发师只能同时服务一位顾客。一旦一位理发师完成了对顾客的服务,他将立即有空去服务其他的顾客。

当理发店开门的时候,聪明的顾客总会选择能让他们尽早离开的理发师。如果找不到有空的理发师,顾客会等待直到有理发师空闲。

你是第N位顾客,此时商店刚刚开门营业,猜猜看哪位你会享受到哪位理发师的服务呢?

输入

第一行输入告诉你有几组样例, T。T组如下。

每组样例中,有由空格分开的两个整数B和N--理发师的数目和你的位置。队伍中第一位顾客的标号是1,第二位是2,按照这个规律。第二行包含了
M1M2, ..., MB.


输出

对于每组样例,输出一行包含 "Case #x: y", x 表示样例的标号(从1开始),y 表示服务你的理发师的标号。

数据规模

1 ≤ T ≤ 100.
1 ≤ N ≤ 109.

1 ≤ B ≤ 1000.
1 ≤ Mk ≤ 100000.


Input:

 
   

Output:

 
   

Sample Input:
3
2 4
10 5
3 12
7 7 7
3 8
4 2 1
Sample Output:
Case #1: 1
Case #2: 3
Case #3: 1
Source:

Round 1A, Google code jam 2015

借鉴了学长的思路  (利用二分查找)先找到时间T使得在T时间时第n个人已经开始理发  然后求出T-1时有多少人已经开始理发(包括刚开始理发)记录为last 再依次对理发师进行遍历 如果T%b[i]==0 说明这位理发师已经可以开始理发  last++ 直到last=n 输出即可;

AC代码:
 
         
         
  1. #include <stdio.h>
  2. #include "string.h"
  3. long long int sfun(int *bb,int b,long long int x)
  4. {
  5. long long int sum=0;
  6. for(int i=0;i<b;i++)
  7. sum+=(x+bb[i])/bb[i];
  8. return sum;
  9. }
  10. int main()
  11. {
  12. int t;
  13. scanf("%d",&t);
  14. while(t--)
  15. {
  16. int b,bb[1005];
  17. long long int left,right,n;
  18. scanf("%d%lld",&b,&n);
  19. for(int i=0;i<b;i++)
  20. scanf("%d",&bb[i]);
  21. left=0;right=n*100005;
  22. while(left<right)
  23. {
  24. long long int middle=(left+right)/2;
  25. if(sfun(bb,b,middle)<n) left=middle+1;
  26. else right=middle;
  27. }
  28. long long int temp=sfun(bb,b,left-1);
  29. int ans=0;
  30. for(int i=0;i<b;i++)
  31. {
  32. if(left%bb[i]==0)
  33. {
  34. temp++;
  35. if(temp==n)
  36. {
  37. ans=i+1;
  38. break;
  39. }
  40. }
  41. }
  42. static int leap=1;
  43. printf("Case #%d: %d\n",leap++,ans);
  44. }
  45. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值