e1. send boxes to alice (easy version)
e2. send boxes to alice (hard version)
easy和hard都沒想出來怎麼貪心。
首先對於k
1k_1k1
,且k1∣
k2k_1|k_2
k1∣k2
,可以顯然得到結論1:把所有數組合為k
1k_1
k1比k
2k_2
k2步驟少。
在某一區間之和等於k時,要把這些數集中在乙個點m。
也就是把數集中在中位數的地方(假設每個數都是1,區間和sum表示sum個1)
#include
using
namespace std;
typedef
long
long ll;
ll a[
1000010];
ll read()
while
(ch>=
'0'&&ch<=
'9') s=s*
10+ch-
'0',ch=
getchar()
;return s*w;
}int
main()
if(sum<=1)
ll ans=
1999999999999999999
;for
(ll i=
2;i*i<=sum;
++i)
ans=
min(ans,cnt);}
if(sum>1)
ans=
min(ans,cnt);}
printf
("%lld"
,ans)
;}d. harmonious graph
可以把每乙個並查集模擬成一條線段,每個並查集的父節點都是編號最大的數,從1開始貪心(也可以想象成把線段按左端點公升序排列),1#include
using
namespace std;
const
int maxn=
2e5+7;
int fa[maxn]
;int
find
(int x)
intmain()
int x,y,fx,fy;
for(
int i=
1;i<=m;
++i)
}int ans=0;
for(
int i=
1;i<=n;
)++i;}}
printf
("%d"
,ans)
;}c. sweets eating
首先把糖按濃度排序,需要吃i個糖時,從第i個開始吃,這樣使濃度大的最先吃,最後的傷害肯定小。然後需要遞推的思想:吃i個糖時,第一天吃i-m到
到到i個糖
前面的i-m個糖會推遲一天吃,要再加一遍,遞推公式:ans
[i]=
ans[
i−m]
+pre
[i];
ans[i]=ans[i-m]+pre[i];
ans[i]
=ans
[i−m
]+pr
e[i]
;吃i個糖和i-m個糖花費的天數肯定不同,所以再加上一邊pre[i-m]是正確的。
#include
using
namespace std;
int a[
200010];
long
long ans[
200010];
long
long pre[
200010];
intmain()
sort
(a+1
,a+1
+n);
pre[0]
=0;for
(int i=
1;i<=n;
++i)
for(
int i=
1;i<=m;
++i)
for(
int i=m+
1;i<=n;
++i)
for(
int i=
1;i<=n;
++i)
cout<
<<
" ";
return0;
}
a. payment without change判斷一下,價值為n的和價值為1的組合,保證aa(aa<=a)*n不超過s的同時,能否用1補充得到s。
#include
using
namespace std;
intmain()
return0;
}
cf刷題日記 1 28 2 1
題意 給你一棵樹,每個節點上有若干餅乾,並且給出每個節點上吃一塊餅乾需要多少時間,同時給出走過一條邊所需時間。總時限為 tt,兩個人輪流進行操作 mitya從當前節點擊擇乙個子節點向下走,或者直接結束遊戲並往根回動吃餅乾 vasya割斷當前節點到其某個子節點的邊,或者什麼都不做。問mitya可以吃到...
CF刷題總結 CF706E鍊錶
這題目應該要秒做出來的。首先看到二維,又沒什麼思路就直接降維 考慮一維的情況,就是一段連續的和另一端連續的交換,最快的當然是鍊錶模擬了。所以考慮到二維中也不應該用陣列儲存,而是鍊錶表示。但是由於二維的話,不可能是簡單的鍊錶。所以考慮每乙個矩形和旁邊的關係。肯定就是四周的,但是只考慮單向,那就是2個方...
PAT刷題日誌
調整刷題策略 集中精力刷 演算法筆記 第四章的題目,夯實基礎。基礎實在太差,第八章之後的題目壓根就不會,做題的時候就是抄一遍 理解一遍 根本不能算作刷題,而是被題刷。之前乙個知識點一道題的方法根本就是走馬觀花,蜻蜓點水,抄一遍 就覺得會了,第二天就忘乾淨了 兩個字來形容 浮躁 十多天的時間裡參加了倆...