結果
| 問題 |
No.31 悪のミックスジュース
|
| コンテスト | |
| ユーザー |
myanta
|
| 提出日時 | 2017-05-05 12:14:07 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,563 bytes |
| コンパイル時間 | 402 ms |
| コンパイル使用メモリ | 43,520 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-14 08:40:48 |
| 合計ジャッジ時間 | 1,069 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 11 WA * 6 |
コンパイルメッセージ
main.cpp: In function ‘ll solve(vll&, int)’:
main.cpp:47:44: 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’ [-Wnarrowing]
47 | cand.push_back((area_t){0, s.size()-1, v});
| ~~~~~~~~^~
main.cpp: In function ‘int main()’:
main.cpp:94:30: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
94 | scanf("%d", &c[i]);
| ~~~~~^~~~~~~~~~~~~
main.cpp: In function ‘ll solve(vll&, int)’:
main.cpp:61:30: warning: ‘min_i’ may be used uninitialized in this function [-Wmaybe-uninitialized]
61 | ca=cand[min_i];
| ^
main.cpp:62:29: warning: ‘min_n’ may be used uninitialized in this function [-Wmaybe-uninitialized]
62 | ret+=(s[ca.s+min_n]-s[ca.s])*min_base_v;
| ~~~~^~~~~~
main.cpp:72:48: warning: ‘min_base_v’ may be used uninitialized in this function [-Wmaybe-uninitialized]
72 | cand.push_back((area_t){ca.s+min_n, ca.n-min_n, min_base_v});
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#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;
}
myanta