HDU 5933(模拟)

题意:

有n个数,对于这n个数,每次只能执行下面两种操作其中的一种:
一:将相邻的两个数相加合并成一个数,
二:将一个数分成相邻的两个数,这两个数的和仍然等于之前的数
请问至少需要多少次操作才能将这n个数变成k个相等的数。

思路:

顺着模拟,处理f>kk时比较巧妙。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=200005;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int main()
{
    int t,n,k,cas=0;
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        deque<ll> dq;
        ll sum=0;
        for(int i=0;i<n;i++)
        {
            ll a;
            scanf("%lld",&a);
            dq.push_back(a);
            sum+=a;
        }
        cout<<"Case #"<<++cas<<": ";
        if(sum%k)
        {
            cout<<-1<<endl;
            continue;
        }
        ll ans=0;
        ll kk=sum/k;
        while(!dq.empty())
        {
            ll f=dq.front();
            dq.pop_front();
            if(f==kk)
            {
                continue;
            }
            if(f>kk)
            {
                ans+=f/kk;
                if((f%kk)==0)
                {
                    ans--;
                }
                else
                {
                    dq.push_front(f%kk);
                }
            }
            if(f<kk)
            {
                ll t=dq.front();
                dq.pop_front();
                dq.push_front(f+t);
                ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;

}

 

posted @ 2018-08-25 10:50  MCQ  阅读(168)  评论(0编辑  收藏  举报