結果

問題 No.31 悪のミックスジュース
ユーザー myantamyanta
提出日時 2017-05-05 12:17:53
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 1,608 bytes
コンパイル時間 359 ms
コンパイル使用メモリ 45,372 KB
実行使用メモリ 4,352 KB
最終ジャッジ日時 2023-10-12 09:46:43
合計ジャッジ時間 1,164 ms
ジャッジサーバーID
(参考情報)
judge13 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 WA -
testcase_02 AC 2 ms
4,348 KB
testcase_03 AC 2 ms
4,352 KB
testcase_04 AC 2 ms
4,348 KB
testcase_05 AC 2 ms
4,348 KB
testcase_06 AC 1 ms
4,348 KB
testcase_07 AC 1 ms
4,352 KB
testcase_08 AC 1 ms
4,348 KB
testcase_09 WA -
testcase_10 AC 1 ms
4,348 KB
testcase_11 WA -
testcase_12 AC 2 ms
4,352 KB
testcase_13 AC 2 ms
4,348 KB
testcase_14 WA -
testcase_15 AC 2 ms
4,348 KB
testcase_16 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<cstdio>
#include<vector>


using namespace std;
using ll=long long;
using vi=vector<int>;
using vll=vector<ll>;


struct area_t
{
	int s, n, l;
};


void calc_area(vll& s, area_t& a, int v, int& base_v, double& min_ave, int& min_n)
{
	vi w;

	min_n=1;
	min_ave=s[a.s+min_n]-s[a.s];
	for(int n=2;n<=a.n && n<=v;n++)
	{
		double ave=(double)(s[a.s+n]-s[a.s])/n;
		if(min_ave>ave)
		{
			min_ave=ave;
			min_n=n;
		}
	}

	base_v=v/min_n;
	if(base_v>a.l) base_v=a.l;
}


ll solve(vll& s, int v)
{
	ll ret=0;
	int min_base_v=0, base_v, min_n=0, n, min_i=0, i, rest_v;
	double min_ave, ave;
	area_t ca;
	vector<area_t> cand;

	rest_v=v;
	cand.push_back((area_t){0, (int)s.size()-1, v});
	for(;;)
	{
		for(i=0;i<cand.size();i++)
		{
			calc_area(s, cand[i], rest_v, base_v, ave, n);
			if(i==0 || min_ave>ave)
			{
				min_ave=ave;
				min_n=n;
				min_base_v=base_v;
				min_i=i;
			}
		}
		ca=cand[min_i];
		ret+=(s[ca.s+min_n]-s[ca.s])*min_base_v;

		rest_v-=min_base_v*min_n;
		if(rest_v<=0) break;
		if(ca.l-min_base_v>0)
		{
			cand.push_back((area_t){ca.s, min_n, ca.l-min_base_v});
		}
		if(ca.n-min_n>0 && min_base_v>0)
		{
			cand.push_back((area_t){ca.s+min_n, ca.n-min_n, min_base_v});
		}
		cand.erase(cand.begin()+min_i);
	}

	return ret;
}


int main(void)
{
	int n, v, i;
	vi c, w;
	vll s;

	while(scanf("%d%d", &n, &v)==2)
	{
		s.resize(n+1);
		w.resize(n);
		c.resize(n);
		s[0]=0;
		for(i=0;i<n;i++)
		{
			scanf("%d", &c[i]);
			w[i]=1;
			s[i+1]=s[i]+c[i];
		}

		if(v<=n)
		{
			printf("%lld\n", s[n]);
			continue;
		}

		v-=n;
		printf("%lld\n", solve(s, v)+s[n]);
	}

	return 0;
}
0