题目链接http://codeforces.com/problemset/problem/589/D

题目大意:给出n个人行走的开始时刻,开始时间和结束时间,求每个人分别能跟多少人相遇打招呼(每两人只能打招呼一次)。

例:

输入:
3
1 1 10
5 8 2
9 9 10

输出:

2 1 1

解题思路:先按行走的开始时刻排下序,然后直接模拟判断和比他后出现的人是否可以相遇。

第一步判断前面那个人在未走完前,下一人会出现,若不出现,直接break。然后就计算当下一个人出现的时刻,前一个人的位置,然后又分种情况,两个人可能刚好在一起,有可能在他左边,也可能在他右边。刚好在一起很好,直接相遇了,若不相遇,则要判断他们是否同向,若同向,肯定不可能相遇,速度是相同的,判断是否同向,直接两个人的终点减去起点相乘是否大于0就可以,不过要注意的是:他们相乘会爆int,我就因为这个找了一个多小时才找出来,还总以为自己漏了情况。。。。反方向的话,直接计算他们的位置判断是否在他们行走的范围以内即可。

附上代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
struct node{
int t; //开始行走的时刻
int s; //开始位置
int f; //结束位置
int id; //序号
}p[];
int n,cnt[];
bool comp(const node &a,const node &b)
{
return a.t<b.t;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(cnt,,sizeof(cnt));
for(int i=;i<n;i++)
{
scanf("%d%d%d",&p[i].t,&p[i].s,&p[i].f);
p[i].id=i;
}
sort(p,p+n,comp); //按开始行走的时刻排序
//cout<<endl;
//for(int i=0;i<n;i++)
// cout<<p[i].t<<" "<<p[i].s<<" "<<p[i].f<<endl;
int t,pos;
for(int i=;i<n-;i++)
{
for(int j=i+;j<n;j++)
{
if(p[i].t+abs(p[i].f-p[i].s)<p[j].t) //第i个人走完了,第j个人还未出现,直接break
break;
t=p[j].t-p[i].t;
if(p[i].f>p[i].s)
pos=p[i].s+t;
else
pos=p[i].s-t; //pos为第j个人出现的时候第i个人的位置
//cout<<pos<<endl;
if(pos==p[j].s) //在j的其实位置相遇
{
cnt[p[i].id]++;
cnt[p[j].id]++;
}
else if(pos<p[j].s)
{
ll y=(ll)(p[i].f-p[i].s)*(ll)(p[j].f-p[j].s);
if(y>) //两个人同向,速度相同,追不上
continue;
if((p[i].f-p[i].s)<&&(p[j].f-p[j].s)>) //反向但是位置不对
continue;
double x=pos+(p[j].s-pos)/2.0; //相遇位置
if(x<=p[i].f&&x>=p[j].f)
{
cnt[p[i].id]++;
cnt[p[j].id]++;
//cout<<p[i].id<<" "<<p[j].id<<endl;
}
}
else
{
ll y=(ll)(p[i].f-p[i].s)*(ll)(p[j].f-p[j].s);
if(y>)
continue;
if((p[i].f-p[i].s)>&&(p[j].f-p[j].s)<)
continue;
double x=pos-(pos-p[j].s)/2.0;
if(x<=p[j].f&&x>=p[i].f)
{
cnt[p[i].id]++;
cnt[p[j].id]++;
//cout<<p[i].id<<" "<<p[j].id<<endl;
}
} }
}
printf("%d",cnt[]);
for(int i=;i<n;i++)
printf(" %d",cnt[i]);
printf("\n");
}
return ;
}

CodeForces - 589D(暴力+模拟)的更多相关文章

  1. Vicious Keyboard CodeForces - 801A (暴力+模拟)

    题目链接 题意: 给定一个字符串,最多更改一个字符,问最多可以有多少个“VK”子串? 思路: 由于数据量很小,不妨尝试暴力写.首先算出不更改任何字符的情况下有多个VK字串,然后尝试每一次更改一个位置的 ...

  2. codeforces 591B Rebranding (模拟)

    Rebranding Problem Description The name of one small but proud corporation consists of n lowercase E ...

  3. bnuoj 20832 Calculating Yuan Fen(暴力模拟)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=20832 [题意]: 给你一串字符串,求一个ST(0<ST<=10000),对字符串中字符 ...

  4. POJ 1013 小水题 暴力模拟

    Counterfeit Dollar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35774   Accepted: 11 ...

  5. hdu_1006 Tick and Tick(暴力模拟)

    hdu1006 标签(空格分隔): 暴力枚举 好久没有打题了,退队了有好几个月了,从心底不依赖那个人了,原来以为的爱情戏原来都只是我的独角戏.之前的我有时候好希望有个人出现,告诉自己去哪里,做什么,哪 ...

  6. hihoCoder #1871 : Heshen's Account Book-字符串暴力模拟 自闭(getline()函数) (ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction B) 2018 ICPC 北京区域赛现场赛B

    P2 : Heshen's Account Book Time Limit:1000ms Case Time Limit:1000ms Memory Limit:512MB Description H ...

  7. 美团2018年CodeM大赛-资格赛 分数 暴力模拟

    链接:https://www.nowcoder.com/acm/contest/138/D来源:牛客网 小胖参加了人生中最重要的比赛——MedoC资格赛.MedoC的资格赛由m轮构成,使用常见的“加权 ...

  8. 2018/7/31-zznu-oj-问题 B: N! 普拉斯 -【求大数的阶乘-ll存不下-然后取尾零的个数输出-暴力模拟】

    问题 B: N! 普拉斯 时间限制: 1 Sec  内存限制: 128 MB提交: 114  解决: 35[提交] [状态] [讨论版] [命题人:admin] 题目描述 在处理阶乘时也需要借助计算器 ...

  9. 2018/7/31-zznuoj-问题 A: A + B 普拉斯【二维字符串+暴力模拟+考虑瑕疵的题意-0的特例】

    问题 A: A + B 普拉斯 在计算机中,数字是通过像01像素矩阵来显示的,最终的显示效果如下:  现在我们用01来构成这些数字 当宝儿姐输入A + B 时(log10(A)<50,log10 ...

  10. what the fuck!(二分查找 / 暴力模拟)

    what the fuck! Description 现在有一家公司有nnn个员工(nnn为奇数),他们的工资发放是基本工资+提成,现在这家公司计划再招一批人.要写一篇招聘启事,但是对于这个招聘启事中 ...

随机推荐

  1. python3 九九乘法表打印花式操作(然并卵)

    # 九九乘法表# 方法一# for i in range(1, 10):# for j in range(1, i+1):# print('{}x{}={}\t'.format(i, j, i*j), ...

  2. css兼容display:flex

    上代码: 这个是针对父元素: .container{ display: -webkit-box; /* Chrome 4+, Safari 3.1, iOS Safari 3.2+ */ displa ...

  3. vue单页面模板说明文档(3)

    Environment Variables Sometimes it is practical to have different config values according to the env ...

  4. Windows字符集安装

    0. 获取字符集安装文件. 最简单的办法 上msdn i tell you 下载 多语言安装盘. 一般都比较大. 比如: 1. 进入windows10 操作系统. 运行输入: lpksetup 选择安 ...

  5. Oracle行列转换case when then方法案例

    select (select name from t_area where id=areaid) 区域, end) 一月, end) 二月, end) 三月, end) 四月, end) 五月, en ...

  6. Eclipse打开java文件繁体字

    右键-->properties-->Resource-->Text file encoding, 改成utf-8 .

  7. PhpStorm 配置链接远程虚拟机

    安装好了 PhpStorm 之后,打开项目文件夹,接着点击工具栏 Tools: 2.接着点击 tools>Deployment: 3.点击Configuration 开始配置    4.填好箭头 ...

  8. Eclipse的一个“bug”

    标题之所以打上双引号,是因为暂时不知道怎么确定. 一个 .java文件里有两个类:public Bath:Soap.它们都有一个main()方法. 从命令行单独访问任意一个类的main()方法,都没毛 ...

  9. python3文字转语音

    #安装库(必须先安装pywin32) pip3 install pyttsx3 简单测试 import pyttsx3 engine = pyttsx3.init() text='name' engi ...

  10. 如何在DataTemplate中绑定RadioButton的Checked事件

    在我们的项目中经常要用到数据模板,最近做的一个项目中在数据模板中要放一些RadioButton,其中每一个RadioButton设置了Checked事件,如果直接在View层写Checked事件的话不 ...