題目鏈接~~>
做題感悟:這題可以直接二分,也可以分段二分和枚舉差不多。
解題思路:
存每個數的時候同時存每個數的下標,然後排個序先按從小到大排,再按下標從小到大排,這樣相同的數都在一塊,因為最多可以選 k 個,那麼我們就按 K 個來,這樣依次枚舉每個數的最大范圍(在同一個數的區間內),分段二分就可以了。感覺數據有點水,寫完竟然 1 A .
代碼:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std ; #define INT long long int #define L(x) (x * 2) #define R(x) (x * 2 + 1) const int INF = 0x3f3f3f3f ; const double esp = 0.0000000001 ; const double PI = acos(-1.0) ; const int mod = 1000000007 ; const int MY = (1<<5) + 5 ; const int MX = (1<<20) + 5 ; const int S = 20 ; int n ,m ; int sum[MX] ,g[MX] ; struct node { int c ,id ; }T[MX] ; bool cmp(node a ,node b) { if(a.c == b.c) return a.id < b.id ; else return a.c < b.c ; } int main() { while(~scanf("%d%d" ,&n ,&m)) { for(int i = 1 ;i <= n ; ++i) { scanf("%d" ,&T[i].c) ; T[i].id = i ; // 位置 } sort(T ,T+n+1 ,cmp) ; memset(sum ,0 ,sizeof(sum)) ; g[0] = 0 ; g[1] = T[1].c ; for(int i = 2 ;i <= n ; ++i) { if(T[i].c == T[i-1].c) sum[i] = sum[i-1] + T[i].id - T[i-1].id -1 ; g[i] = T[i].c ; } int i = 1 ,ans = 1 ,Le ,Rt ; while(i < n) { Le = i ; Rt = upper_bound(g ,g+n+1 ,T[i].c) - g ; // 尋找同一組的邊界 for(int j = Le ;j < Rt ; ++j) { int mx = upper_bound(sum+Le ,sum+Rt ,sum[j]+m) - sum ; ans = max(ans ,mx - j) ; } i = Rt ; } cout<
poj2115-C Looooops(擴展歐幾裡德算法),p
HDU 1325 Is It A Tree? Probl
逆波蘭式 棧實現 因為做二叉樹非遞歸的前後中遍歷,用到棧
[Practical.Vim(2012.9)].Drew.N
對於眾多人提出的c/c+
UVA - 10591 - Happy Number