2016年4月25日 星期一

(Zj) a871: 11. Museum Area [逆時針排序點,外積]

http://zerojudge.tw/ShowProblem

我的想法是:先把點點按照順or逆時針排序(直接看code比較快),然後取一個定點,算出那個定點和另外兩個連續的點構成的三角形面積。

http://codepad.org/WBmoELb5

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <iomanip>
using namespace std;

const int MAX_N = 12;

struct Point {
 double x;
 double y;
} point[MAX_N];

double cross(Point o,Point a,Point b) {
 return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
}

double dis(Point a,Point b) {
 return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}

double get_area(Point a,Point b,Point c) {
 double p = dis(a,b);
 double q = dis(b,c);
 double r = dis(a,c);
 double s = (p+q+r)/2;
 return sqrt(s*(s-p)*(s-q)*(s-r));
}

bool cmp(const Point &p1,const Point &p2) {
 return cross(point[0],p1,p2) < 0.0;
}

int main () {
 int n;
 while (scanf("%d",&n) != EOF) {
  for (int X=0;n>X;X++) {
   double i,j;
   cin >> i >> j;
   point[X].x=i;
   point[X].y=j;
  }
  sort(point+1,point+n,cmp);
  double ans = 0.0;
  for (int x=1;n-1>x;x++) {
   ans+=get_area(point[0],point[x],point[x+1]);
  }
  cout<<fixed<<setprecision(2)<<ans<<endl;
 }
}

2016年4月23日 星期六

(HP Codewar)

HP Codewar 心得:

1. Python好好用
2. 會一直搶電腦
3. 下次參賽要帶兩個來亂的

team : 57
score : 145

(Python) (codeforces) 633A. Ebony and Ivory

http://codeforces.com/contest/633/problem/A

原本想要用dp,在想說用python摳dp滿刺激的。

後來,看到AC人數這麼多,才發現,有夠好的做法~~

枚舉a要多少,就有相對應的b,如果相對應b是合法(不是分數 && >=0),就有答案。

枚舉a時,枚舉0 ~ c

http://codeforces.com/contest/633/submission/17463583

(Python) (codeforces) 50A. Domino piling

http://codeforces.com/problemset/problem/50/A

認真實作即可

http://codeforces.com/contest/50/submission/17463433



(Zj) a870. 10. List Maker

http://zerojudge.tw/ShowProblem?problemid=a870

實作一個Linked-List

找位置(INSERT)的時候用個map

http://codepad.org/4hXztYUM

2016年4月21日 星期四

(Python) (Codeforces) 664B. Rebus

http://codeforces.com/contest/664/problem/B

如果標題有Python,就代表說我是用Python寫的XDDD

其實都可以用C++寫喔

這題的大意是說:給你一個式子,表達成? + ? - ? + ? ....... = n,?的數字必須介於[1,n],可以重複。你的目標是:判斷這個等式可不可以成立,如果成立了,請輸出任意一組解。

例如:? + ? - ? = 3,可以說是2 + 3 - 2 = 3

我的作法:總共會有c1個+,c2個-,對於每個正負,正的最大可以到c1*n,最小的到c1,負的最大可以到c2*n,最小可以到c2,可以創造出來的值就介於c1*n - c2 >= val >= c1 - c2*n。如果這個val可以成立,那我就先是如果正的部分是c1*n,可不可以有相對應的負值,如果有,就輸出(等等再講),沒有的話,那就設定負的部分是c2*n,再去找相對應的正值。

如何輸出呢:先盡可能地接近平均XDDD

http://codeforces.com/contest/664/submission/17419599


2016年4月19日 星期二

(TOJ) 47. 1d-kd-tree

http://sprout.tw/oj/pro/47/

其實這題主要是要讓你實作一棵二元搜尋樹啦,但是我的code不是這樣寫(delete有點麻煩XD)

如果是走二元搜尋樹,insert就是依照key值走下去就對了,query就認真找吧,delete的話,最麻煩的case是要找左子樹的max或右子樹的min。(有點籠統,抱歉~~)

我的離線(off-line)作法是,先把所有數值離散化後,開一棵數值線段樹,記錄說離散化後的這個數字有沒有出現過,沒有的話設成INF,對於每個區間,我要維護說這個區間的Max和Min。

接下來講query的部分,當如果你今天要往左子樹query的時候,右子樹的Min可能是你右邊的答案,往右子樹走的時候,左邊樹的Max可能是你的答案。

所以,綜合一下,就會發現,這題不難XDDD。

(用Treap寫也或許可以,找機會有天來試試看XDDD)

Code :
http://codepad.org/YRd2ghje