結果

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

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
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 1 ms
4,352 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,352 KB
testcase_09 WA -
testcase_10 AC 1 ms
4,348 KB
testcase_11 WA -
testcase_12 AC 2 ms
4,348 KB
testcase_13 AC 1 ms
4,348 KB
testcase_14 WA -
testcase_15 AC 2 ms
4,352 KB
testcase_16 WA -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘ll solve(vll&, int)’:
main.cpp:47:37: warning: narrowing conversion of ‘((& s)->std::vector<long long int>::size() - 1)’ from ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} to ‘int’ inside { } [-Wnarrowing]
  cand.push_back((area_t){0, s.size()-1, v});
                             ~~~~~~~~^~
main.cpp:61:16: warning: ‘min_i’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   ca=cand[min_i];
                ^
main.cpp:70:10: warning: ‘min_n’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   if(ca.n-min_n>0 && min_base_v>0)
      ~~~~^~~~~~
main.cpp:72:27: warning: ‘min_base_v’ may be used uninitialized in this function [-Wmaybe-uninitialized]
    cand.push_back((area_t){ca.s+min_n, ca.n-min_n, min_base_v});
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ソースコード

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, base_v, min_n, n, min_i, i, rest_v;
	double min_ave, ave;
	area_t ca;
	vector<area_t> cand;

	rest_v=v;
	cand.push_back((area_t){0, 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});
		}
	}

	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