結果
| 問題 |
No.417 チューリップバブル
|
| ユーザー |
myanta
|
| 提出日時 | 2017-05-31 15:01:43 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 47 ms / 2,000 ms |
| コード長 | 1,676 bytes |
| コンパイル時間 | 635 ms |
| コンパイル使用メモリ | 53,760 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-21 20:19:40 |
| 合計ジャッジ時間 | 1,979 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:100:43: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
100 | for(int i=0;i<n;i++) scanf("%d", &u[i]);
| ~~~~~^~~~~~~~~~~~~
main.cpp:106:30: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
106 | scanf("%d%d%d", &a, &b, &c);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
using namespace std;
using vi=vector<int>;
using vvi=vector<vi>;
using pii=pair<int,int>;
using vpii=vector<pii>;
using vvpii=vector<vpii>;
int max_u(int&m, int v)
{
if(m<v)
{
m=v;
return 1;
}
return 0;
}
void solve_i(vvpii& v, vi& u, int m, int p, int c, vi& dp, int& ret)
{
vi t, t_sum;
//printf("m=%d p=%d c=%d\n", m, p, c);
if(m<0) return;
t_sum.assign(m+1, -1);
t_sum[0]=0;
for(auto&ve:v[c])
{
if(ve.first==p) continue;
t.assign(m+1, -1);
solve_i(v, u, m-ve.second*2, c, ve.first, t, ret);
for(int i=m;i>=0;i--)
{
if(t_sum[i]<0) continue;
for(int j=t.size()-1;j>=0;j--)
{
int ni=i+j+ve.second*2;
if(ni>m) continue;
if(t[j]<0) continue;
max_u(t_sum[ni], t_sum[i]+t[j]);
}
}
/*
printf("t ");
for(auto dpe:t) printf("%d ", dpe);
printf("\n", ret);
*/
}
/*
printf("t_sum ");
for(auto dpe:t_sum) printf("%d ", dpe);
printf("\n", ret);
*/
for(int i=0;i<=m;i++)
{
if(t_sum[i]<0) continue;
max_u(dp[i], t_sum[i]+u[c]);
max_u(ret, dp[i]);
}
/*
printf("dp ");
for(auto dpe:t_sum) printf("%d ", dpe);
printf("\nret=%d\n", ret);
*/
}
int solve(vvpii& v, vi& u, int m)
{
vi dp;
int ret=-1;
dp.assign(m+1, -1);
solve_i(v, u, m, -1, 0, dp, ret);
return ret;
}
int main(void)
{
int n, m;
vi u;
vvpii v;
while(scanf("%d%d", &n, &m)==2)
{
v.clear();
v.resize(n);
u.resize(n);
for(int i=0;i<n;i++) scanf("%d", &u[i]);
for(int i=0;i<n-1;i++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
v[a].push_back(make_pair(b, c));
v[b].push_back(make_pair(a, c));
}
printf("%d\n", solve(v, u, m));
}
return 0;
}
myanta