C++奧賽一本通貪心題解

小哈里發表於2018-05-01

C++奧賽一本通刷題記錄(貪心)

2017.11.15 By gwj1139177410
書不見了,佔坑待填。

  1. An Easy Problem poj2453

    //貪心, 將最右邊第一個01改成10並將其右邊的1都往右移到最低位
    #include<iostream>
    using namespace std;
    int main(){
        unsigned int n, x;
        while(cin>>n &&n){
            x = n&-n;
            cout<<(n+x+(n^(n+x))/x/4)<<"\n";//感受一下來自位運算的恐懼吧
        }
        return 0;
    }
    
  2. 最大子矩陣 openjudge1768

  3. 金銀島 openjudge1797

    //金屬可分割, 所以直接貪心單位價值最大的優先選
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn = 10010;
    int w, s;  double ans;
    struct node{ double n, v; }a[maxn];
    bool cmp(node a, node b){ return a.v/a.n>b.v/b.n;}
    int main(){
        int T;  scanf("%d", &T);
        while(T--){
            ans = 0;
            scanf("%d%d", &w,&s);
            for(int i = 1; i <= s; i++)
                scanf("%lf%lf", &a[i].n, &a[i].v);
            sort(a+1,a+s+1,cmp);
            for(int i = 1; i<=s; i++){
                if(w >= a[i].n){ w -= a[i].n; ans += a[i].v; }
                else { ans += a[i].v/a[i].n*w; break; }
            }
            printf("%.2lf\n", ans);
        }
        return 0;
    }
    
  4. 裝箱問題 openjudge19

  5. Ride to Office openjudge2404

  6. 書架 openjudge2407

  7. 電池的壽命 openjudge2469

  8. 尋找平面上的極大點 openjudge2704

  9. 最小新整數 openjudge3528

  10. Crossing River openjudge702

  11. 接水問題 openjudge15

相關文章