小明在旅遊的路上看到了一條美麗的河,河上有許多船隻,有的船隻向左航行,有的船隻向右航行。小明希望拍下這一美麗的風景,並且把盡可能多的船隻都完整地拍到一張**中。
小明位於河的邊上,並且可以在河邊的任意位置進行拍照,照相機的視野恰好為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 ...