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;
} 
京公网安备 11010502036488号