HDU 5933 && 2016CCPC杭州 A: ArcSoft's Office Rearrangement

来源:互联网 发布:护盾数据恢复软件下载 编辑:程序博客网 时间:2024/05/16 11:52



题意:

有n个数,每次可以将相邻的两个数合并成一个更大的数,也可以将一个数拆分成两个不为0的数

问至少经过多少次操作可以使最终序列为k个一样大的数,如果不可能做到输出-1


当所有数的和不是k的倍数就是-1,不然一定有解

直接从第一个数开始模拟,如果太大就拆分,如果太小就和前面一个数剩下的部分合并

#include<stdio.h>#include<stack>using namespace std;#define LL long longLL a[100005];stack<LL> st;int main(void){LL T, n, i, k, sum, now, x, ans, cas = 1;scanf("%lld", &T);while(T--){sum = ans = 0;scanf("%lld%lld", &n, &k);for(i=1;i<=n;i++){scanf("%lld", &a[i]);sum += a[i];}if(sum%k!=0){printf("Case #%lld: -1\n", cas++);continue;}sum /= k;for(i=n;i>=1;i--)st.push(a[i]);now = 0;while(st.empty()==0){x = st.top();st.pop();if(now+x==sum){if(now!=0)ans++;now = 0;}else if(now+x<sum){if(now!=0)ans++;now += x;}else{st.push(x-(sum-now));if(now==0)ans--;now = 0;ans += 2;}}printf("Case #%lld: %lld\n", cas++, ans);}return 0;}


原创粉丝点击