C. Sweets Eating(递推,贪心,思维)
题意:给出n个糖果,每天最多可以吃m颗,分别求出吃1-n颗糖果获得的最小甜度值。甜度值等于第i颗的a[i]*第几天吃它。
根据贪心思想,每颗糖果的甜度越小应该越晚吃,需要吃i颗糖果时,将所有糖果甜度值排序取最小的前i个,甜度越大吃的越早。
因为每天可以吃m颗糖果,所有吃i颗时的甜度值等于i-1颗时加上排序后取余m等于i%m的糖果。
这里画一下就很清楚了/、
(还有,关流可真香啊快读得不到我宠幸了vector也好好用)
int main() { fast; int n,m; cin>>n>>m; vi v(n);cin>>v; sort(all(v)); vector<ll >sum(m+1,0),ans(n,0); rep(i,n) { sum[i%m]+=v[i]; if(i==0) ans[i]=sum[i%m]; else ans[i]=ans[i-1]+sum[i%m]; } cout<<ans; //stop; return 0; }
D. Harmonious Graph(好久没写过的并茶几)
题意: 无向图,要求使图中,如果x点可以到达y,那么x可以到达所有 x ~ y 中任意一点,问加多少边能使原图符合要求。
并茶几,思路比C题好想(我认为),好久没写过并茶几再写居然一发就A了,还是挺好写的。
为了减少博客长度省掉开头宏定义惹(●ˇ∀ˇ●))
int n,m,fa[MAXN]; int find (int x){return x==fa[x]? x : fa[x]=find(fa[x]);} int main() { fast; cin>>n>>m; for(int i=0;i<=n;++i) fa[i]=i; rep(i,m) { int x,y;cin>>x>>y; if(x>y) swap(x,y); fa[find(y)] =find(x); } int pre=find(n),sum=0; for(int i=n;i>=1;--i) { if(find(i)>pre) ++sum,fa[find(i)]=pre; pre=min(pre,find(i)); } cout<<sum<<'\n'; return 0; }