2016 百度之星 複賽 拍照

2022-01-17 01:57:56 字數 1610 閱讀 1766

小明在旅遊的路上看到了一條美麗的河,河上有許多船隻,有的船隻向左航行,有的船隻向右航行。小明希望拍下這一美麗的風景,並且把盡可能多的船隻都完整地拍到一張**中。

小明位於河的邊上,並且可以在河邊的任意位置進行拍照,照相機的視野恰好為90度角,只能以垂直於河邊的方向進行拍照。河上的船隻全都可看作是平行於河邊的一條線段,跟河邊的距離各不相同,有的正在向左移動,有的正在向右移動,但移動速度恰好都是一樣的。小明可以等待恰當的時間讓盡量多的船隻都走進照相機的視野裡,你不需要考慮船隻之間會互相遮擋視野的情況。

思路:

首先得發現這兩條規律:

1.設船到河岸的距離為h,則如果 y-x > 2*h ,則這條船不可能被完整拍到。

2.設河岸[l,r]範圍內能夠拍到船,則 l=y-h , r =x+h 。

然後計算每個河岸上的點能夠拍到多少條船,兩個方向分別處理。

後面的真是不好敘述,如果當面用草稿紙說明會比較方便,看**吧。資料範圍太大,需要離散化。

#include "algorithm"

#include "iostream"

#include "cstring"

#include "cstdio"

#include "string"

#include "stack"

#include "cmath"

#include "queue"

#include "set"

#include "map"

#define lson l , m , rt << 1

#define rson m + 1 , r , rt << 1 | 1

typedef long long ll;

typedef unsigned long long ull;

using namespace std;

const int inf=0x3f3f3f3f;

const int maxn=1e6+5;

const int mod = 1e9 +7;

//從右開始順時針

int dir4[4][2]= ;

int dir8[8][2]= ;

int n;

int lisan[maxn<<1];

int lsum[maxn<<1];

int rsum[maxn<<1];

struct ship

} ship[10000+5];

int main()

{ //freopen("in_3.txt","r",stdin);

int t;

scanf("%d",&t);

for(int ii=1; ii<=t; ii++)

{printf("case #%d:\n",ii);

memset(lsum,0,sizeof lsum);

memset(rsum,0,sizeof rsum);

scanf("%d",&n);

int index = 0;

for(int i=0; i

2016百度之星複賽 1003 拍照 掃瞄線

有n條船平行於x軸,已知初始時刻的位置,向平行於x軸正向或反向走。所有船速度大小一致。現在海哥站在x軸上,要給船拍照,角度為朝向 y方向的固定90度,可以在任意時刻 任意位置拍,問何時拍下的完整的船數量最多。對於橫座標為 x,y 縱座標為z的船而言,海哥可以移動的區間為 y z,x z 且y z x...

百度之星複賽題解

problem description 眾所周知,度度熊非常喜歡數字。它最近在學習小學算術,第一次發現這個世界上居然存在兩位數,三位數 甚至n位數!但是這回的算術題可並不簡單,由於含有表示bomb的 號,度度熊稱之為 arithmetic of bomb。bomb number中的bomb,也就是 ...

2016百度之星 Problem B

度熊面前有乙個全是由1構成的字串,被稱為全1序列。你可以合併任意相鄰的兩個1,從而形成乙個新的序列。對於給定的乙個全1序列,請計算根據以上方法,可以構成多少種不同的序列。input 這裡包括多組測試資料,每組測試資料報含乙個正整數nn 代表全1序列的長度。1 n 2001 n 200 output ...