1. 程式人生 > >COCI 2011-2012 setnja

COCI 2011-2012 setnja

b- image ID using bubuko ring 輸入 input code

TM :setnja (1S256M)一個人要散步去會見他的 N 個朋友(按給定的順序會見)。我們可以理解成他們都住在一個

很大的網格內,每個朋友住其中的一個單元格,所有人每一步都可以走到相鄰的八個格子中。
每個朋友最多可以走 P 步與他相見,每個人的 P 值不一定相同。他可以決定起點和終點。
問他會見完所有朋友的最少步數。
輸入:
第一行,一個正整數 N (2 N 200 000),表示朋友個數。
接下來,N 行,描述 N 個朋友,x, y, and P (0 x, y, P 200 000)x,y 表示朋友最初的坐
標。朋友給的順序就是他要依次會見的順序。
輸出:
一個數,表示他要走的最少的步數。
Scoring
30%的數據,所有數字最多 20.
另有 30%的數據,所有朋友的 P 值小於 10.
樣例:
Input
3
3 10 2
8 4 2
2 5 2
output
4
input
4
3 3 5
7 11 5
20 8 10
30 18 3
output
19
樣例 1,從 (4, 8),出發會見第一個朋友。走兩步在(66)會見第二個朋友,走兩步到(45)會見第三個朋友。
//暫時沒找到那個oj上有

代碼 :

技術分享圖片
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

const int inf = 1000000;
const int N = 2e5 + 10;
struct size_ {
    int x1, x2, y1, y2;
    size_ () {}
    size_ (int x1, int x2, int y1, int y2) : x1(x1), x2(x2), y1(y1), y2(y2) {}
}c[N];

size_ cmp(size_ a, size_ b) {
    size_ w(max(a.x1, b.x1), min(a.x2, b.x2), max(a.y1, b.y1), min(a.y2, b.y2));
    
if( w.x1 > w.x2 || w.y1 > w.y2) return size_ (-inf, -inf, -inf, -inf); return w; } int n; int main() { freopen("setnja.in", "r", stdin); freopen("setnja.out", "w", stdout); scanf("%d", &n); for( int i = 1, x, y, p; i <= n; i ++) scanf("%d%d%d", &x, &y, &p), c[i] = size_(x-p, x+p, y-p, y+p); size_ w
= c[1]; long long ans = 0ll; // 開 long long ,不然會炸 for( int i = 2; i <= n; i ++) { size_ t = cmp(w, c[i]); if( t.x1 != -inf) { w = t; continue ;} int x = max(max(w.x1 - c[i].x2, c[i].x1 - w.x2), max(w.y1 - c[i].y2, c[i].y1 - w.y2)); // printf("%d %d<< \n", x, i); // de bug w = cmp(size_(w.x1-x, w.x2+x, w.y1-x, w.y2+x), c[i]); ans += (long long)x; } printf("%lld", ans); return 0; }
View Code

時間較短,博主考試炸了要改題,為什麽這麽做後2天找時間補上

技術分享圖片

COCI 2011-2012 setnja