• 2015 俄罗斯网络赛 D. Boulevard


    题意:所有人都在一条街上,抽象成坐标轴,有三组输入数据ti,si,fi,表示第i个人在ti秒出现在街上,从si往fi走,单位时间位移为1当两个人走到一个位置时,都互相打招呼,如果两个人相遇多次,只打一次招呼,到了目的地之后就不能打招呼了

    分析:开始没头绪,后来队友说,可以抽象成线段的交点个数问题,每个人的行走过程可以描述成一个二维坐标轴上的线段,这样记录斜率和开始结束的时间就可以搞定了,

    然后分两类,一类是斜率不同,一种是斜率相同,斜率不同只要比较开始结束时间就行了,斜率相同有两种情况(在一条直线上和平行),平行不用管,只要考虑在一条直线上就行了(很简单,自己在纸上分析一下)

    详情见代码

     1 #include<iostream>
     2 #include<string>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<cmath>
     8 #include<vector>
     9 #include<deque>
    10 #include<stack>
    11 using namespace std;
    12 const int maxn=0x3f3f3f;
    13 
    14 struct point{
    15     int t,s,f,k;
    16     int L,R;
    17     void cal(){
    18         if(s<f)k=1;
    19         else k=-1;
    20         L=t;
    21         R=t+abs(f-s);
    22         if(L>R){
    23             int tem=L;
    24             L=R;
    25             R=tem;
    26         }
    27     }
    28 }p[1005];
    29 
    30 bool vis[1005][1005];
    31 int ans[1005];
    32 
    33 int main(){
    34     int n;
    35     while(cin>>n){
    36         for(int i=0;i<n;i++){
    37             cin>>p[i].t>>p[i].s>>p[i].f;
    38             p[i].cal();
    39         }
    40         memset(ans,0,sizeof(ans));
    41         memset(vis,false,sizeof(vis));
    42         for(int i=0;i<n;i++)
    43             for(int j=i+1;j<n;j++){
    44                 if(i==j)
    45                     continue;
    46                 if(p[i].k!=p[j].k){
    47                     double x=p[j].s-p[i].s+p[i].k*p[i].t-p[j].k*p[j].t;
    48                     x/=p[i].k-p[j].k;
    49                     if(!vis[i][j]&&!vis[j][i]&&x>=p[i].L&&x<=p[i].R&&x>=p[j].L&&x<=p[j].R){
    50                         ans[i]++;ans[j]++;
    51                         vis[i][j]=vis[j][i]=1;
    52                     }
    53                 }
    54                 else if((p[j].s-p[i].s+p[i].k*(p[i].t-p[j].t))==0){
    55                     if(p[i].L<=p[j].L&&p[j].L<=p[i].R||p[j].L<=p[i].L&&p[i].L<=p[j].R){
    56                         ans[i]++;ans[j]++;vis[i][j]=vis[j][i]=1;
    57                     }
    58                 }
    59 
    60         }
    61         cout<<ans[0];
    62         for(int i=1;i<n;i++)
    63             cout<<" "<<ans[i];
    64             cout<<endl;
    65     }
    66     return 0;
    67 }
    View Code
  • 相关阅读:
    iphone备忘录存储路径
    wp7常用Task,启动器与选择器
    sql ce 修改表数据
    MessageBox.Show()中的换行
    莫名异常
    wp7中设置toolkit的工具栏图标不能正常显示(DatePicker和TimePicker)
    json 解析
    wp7弹出提示框退出程序
    第一个ios程序
    TextBox只显示数字
  • 原文地址:https://www.cnblogs.com/jihe/p/4893241.html
Copyright © 2020-2023  润新知