1. 程式人生 > >wenbao與貪心

wenbao與貪心

ont rst for n) pro nba esp include online

說起貪心無非就是從大到小或者從小到大,重點是知道從哪個地方進行貪心

噴泉覆蓋問題

http://acm.nyist.net/JudgeOnline/problem.php?pid=12

如果要從坐標或者是半徑貪心顯然太麻煩,不如換個思路,枚舉出每個圓與上邊界的交點,依次貪心。。。。(從左邊滿足覆蓋的前提下找到能夠達到的最右邊)

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 using namespace std;
 5 const int  maxn = 1e3+10
; 6 int main(){ 7 int t; 8 cin>>t; 9 while(t--){ 10 int n, flag = 0, num = 0; 11 double w, h, a, b, H, x, y; 12 pair<double, double> p[maxn]; 13 cin>>n>>w>>h; 14 H = h/2; 15 int t = 0; 16 while
(n--){ 17 cin>>a>>b; 18 if(b > H){ 19 x = a - sqrt(pow(b,2) - pow(H,2)); 20 y = a + sqrt(pow(b, 2) - pow(H, 2)); 21 if(!((x < 0 && y < 0) || (x > w && y > w))){ 22 p[t].first = x;
23 p[t].second = y; 24 //cout<< x << y <<endl; 25 t++; 26 } 27 } 28 } 29 sort(p, p+t); 30 int m = 0; 31 double l = 0, r = 0; 32 while( l < w){ 33 for(int i = m; i < t; i++){ 34 //cout<<"***************"<<endl; 35 if(p[i].first <= l ){ 36 if(p[i].second > r) m = i, r = p[i].second; 37 } 38 else break; 39 } 40 num++; 41 l = r; 42 if( num > t+1) break; 43 //cout<<"@@@@@@@@@@@@@@@@@@@@@@@@@"<<num<<endl; 44 } 45 if(num > t+1) cout<<0<<endl; 46 else{ 47 cout<<num<<endl; 48 } 49 //cout<<num<<endl; 50 } 51 return 0; 52 }

@南陽理工oj

  過橋問題:http://acm.nyist.net/JudgeOnline/problem.php?pid=47

  n個人一個手電筒,求最短的過橋時間

 1 #include <stdio.h>
 2 #include <algorithm>
 3 using namespace std;
 4 int a[1009], n, t;
 5 int q(int x){
 6     if(x <= 2) return max(a[0], a[1]);
 7     else if(x == 3) return a[0] + a[1] + a[2];
 8     else{
 9         if(2*a[1] < a[0]+a[x-2]) return q(x-2) + a[0] + 2*a[1] + a[x-1];
10         else return q(x-2) + 2*a[0] + a[x-1] + a[x-2];
11     } 
12 }
13 int main(){
14     scanf("%d", &t);
15     while(t--){
16         scanf("%d", &n);
17         for(int i = 0; i < n; i++) scanf("%d", &a[i]);
18         sort(a, a+n); printf("%d\n",q(n));
19     }
20     return 0;
21 }
22         

只有不斷學習才能進步!

wenbao與貪心