時間真的不夠啊!刷題的時間都沒有,怎麼寫bolg啊!
在之前的bolg裡,已經講了較簡單的貪心,在這裡就要講一下較難的貪心,所謂較難的貪心,就是貪心和dp,資料結構,圖論,二分等的結合,還有哈夫曼樹,這裡就以題目為例子,來講一下。
對於這種每乙個都是有倍數關係的題目顯然是能選的就選,不能選的就往小的選,所以就500~1一步步的選,能選則選,不能選就往小的選,這就是最優解
很容易證明,對於第i天來說,他要對外生產出來的yi只能是1~i中一天的,這個是顯然的,所以我們只要對於每乙個i往前求一下生產的最小代價即為最終代價
這一題首先不能挑大的刪,下面是乙個反例(213,刪3是21,而刪2是13),那麼我們可以考慮只刪去一次的情況,那麼顯然是從左往右第乙個比下乙個大的數,那麼我們按這樣的策略做m次即可,為什麼,我也不知道(每一次的區域性最優解也就是全域性最優解吧)
還有一種做法:
轉化為原數中選乙個盡量小的長度為?−?的子串行。從高位到低位考慮。維護乙個可以作為第 ? 位的下標區間。每次從可選的區間當中挑選乙個最小的數字,如果有多個,挑選出現的位置最靠前的。時間複雜度 ?(? 2 )。
下面是t2的**:
這一道題很顯然,按照右端點排序,一步步選即可,**如下
在這裡,由於花費是最大值而不是累加和,所以我們可以二列舉答案mid,對於每乙個b[i]它能改變的範圍就是a[i]-mid~a[i]+mid而且要滿足是嚴格上公升即可。**如下:
#includeusing namespace std;
const int n=100010;
int n,t,a[n];
bool check(int mid)
return 1;
}int main()
printf("case #%d:\n%d\n",id,l);
} return 0;
}題目大概:給你n個數,要求你分成k堆。每堆的內部加和,每堆之間是相與。問最大的值。
要&的話這k個數的位數要都是1,那麼我們就可以列舉在二進位制下的每一位是否是1,利用貪心的思想,從大到小的列舉,然後用dp判斷是否在不影響前面的情況下這一位是否是可以為1,這樣一定是最優解。怎麼dp?用dp[i][j]表示目前到j分成i堆是否可行即可很簡單的轉移,**如下:
#includeusing namespace std;
#define ll long long
const int n=60;
ll a[n],k,n,ans;bool f[n][n];
int main()
e[n<<1];
int n,k,f[n][21],head[n],tot;
void inse(int ***x,int yyyy)
int fa[n];bool v[n];
void dfs(int x,int f)
}int main()
e[n];
struct t
tree[n*4];
ll query(ll p,ll sum)
void build(ll p,ll l,ll r)
void change(ll p,ll x)
ll mid=l(p)+r(p)>>1;
if(x<=mid)change(p<<1,x);
else change(p<<1|1,x);
sum(p)=sum(p<<1)+sum(p<<1|1);
}bool cmp(cow a,cow b)
printf("%lld\n",maxx);
}return 0;
}
哈夫曼樹就是乙個二叉樹,這個的合併方式也就是和合併果子的方式一樣,下面舉乙個例子
對於這個怎麼維護,下面就是k叉哈夫曼樹的維護方法,和這個維護方法是一樣的,時間複雜度o(2n)
k叉哈夫曼樹,也就是有k個節點,要維護,固然可以用堆,可是這個時間複雜度也就是o(nlogn)當我們只要做一遍的時候固然可以(因為排序也是o(nlogn))但是如果要做多遍,這個時間複雜度也就不那麼優秀了,那怎麼做呢?我們可以維護兩個佇列,首先我們將所有數插入其中乙個佇列裡,然後我們做一遍k個數的合併,再插入另乙個裡,我們很容易保證這個佇列也是單調遞增的,所以我們在這兩個裡面選k個數然後再插入佇列裡,重複過程即可,當最後只有乙個數的時候,就做完了k叉哈夫曼樹,過程中統計答案即可,但是還有乙個問題,如果不夠怎麼辦?加0即可
下面來到例題
我們首先可以二分列舉k,然後用k叉哈夫曼樹判斷最後的結果是否小於q即可
#includeusing namespace std;
const int n=100010;
int m,n,sum,a[n];
queueq1,q2;
bool check(int k)
if(q2.empty())
if(q1.front()>1;
if(check(mid))r=mid;
else l=mid+1;
} printf("%d\n",l);
} return 0;
}
2019 8 10金華暑假集訓Day14講課總結
我終於聽懂期望了!這個的概念就不多說了,前面已經說過了,下面就全是題目。要求的就是e s 下面就是推導 xi 表示當前有i 1個數,e s e xi e xi 成功匹配的概率為 n i 1 n,所以e xi n n i 1 e s e xi n i 感性理解,a要麼在b前面,要麼在b後面,所以是1 ...
金華集訓 筆記 Day9 字尾陣列
sa i 第i小的字尾的編號 rank i 編號為i的字尾的排名 從小到大 heigt i 第i小的字尾和第i 1小的字尾的最長公共字首 字尾陣列的構造 1 倍增 想要求出每個位置往後2 k2 k 2k個字元,這些字元的排名 由長度為2 k2 k 2k的排名可以得出長度為2k 12 2k 1 的字串...
2019 8 10 金華正睿集訓總結Day14
今天講的例題部分day1講過,這裡不重複了,見day1部落格 期望的平方和平方的期望不同 e x1 x2 2 e x1 2 e x2 2 2e x1x2 當x 0或1 時,x2 x 乙個重要的等式 只對第一行設變數,最後一行列方程 需要注意零轉移情況 有時候max的期望不好算,但min的期望很好算 ...