Bottles CodeForces - 730J

Nick has n bottles of soda left after his birthday. Each bottle is described by two values: remaining amount of soda ai and bottle volume bi (ai?≤?bi).

Nick has decided to pour all remaining soda into minimal number of bottles, moreover he has to do it as soon as possible. Nick spends x seconds to pour x units of soda from one bottle to another.

Nick asks you to help him to determine k — the minimal number of bottles to store all remaining soda and t — the minimal time to pour soda into k bottles. A bottle can‘t store more soda than its volume. All remaining soda should be saved.

Input

The first line contains positive integer n (1?≤?n?≤?100) — the number of bottles.

The second line contains n positive integers a1,?a2,?...,?an (1?≤?ai?≤?100), where ai is the amount of soda remaining in the i-th bottle.

The third line contains n positive integers b1,?b2,?...,?bn (1?≤?bi?≤?100), where bi is the volume of the i-th bottle.

It is guaranteed that ai?≤?bi for any i.

Output

The only line should contain two integers k and t, where k is the minimal number of bottles that can store all the soda and t is the minimal time to pour the soda into k bottles.

Example

Input

43 3 4 34 7 6 5

Output

2 6

Input

21 1100 100

Output

1 1

Input

510 30 5 6 2410 41 7 8 24

Output

3 11

Note

In the first example Nick can pour soda from the first bottle to the second bottle. It will take 3 seconds. After it the second bottle will contain 3?+?3?=?6 units of soda. Then he can pour soda from the fourth bottle to the second bottle and to the third bottle: one unit to the second and two units to the third. It will take 1?+?2?=?3 seconds. So, all the soda will be in two bottles and he will spend 3?+?3?=?6 seconds to do it.

题解:dp[ i ][ j ][ k ]表示1~i个瓶子中已选j个瓶子得到的最大实际装水量。那么dp[ i ][ j ][ k ]=max(dp[ i ] [ j ] [ k ],dp[ i - 1 ][ j - 1][ k - b[ i ] ] + a[ i ] )。

首先,题目要求最少的瓶子最短的时间,而最少的瓶子满足其总容量大于->实际水的总量<-(sumN)。所需要的时间,则是水的总量(sumN)减去这k个瓶子装的水的总量。所以time=sum1-maxSum(K)。

dp好难,初始化都不好掌握 ,><

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn=105;
 5
 6 int n,sum1,sum2;
 7 int dp[maxn][maxn*maxn];
 8
 9 struct node{
10     int a,b;
11     bool operator<(const node& i)const{
12         return i.b<b;
13     }
14 }p[maxn];
15
16 void Inite(){
17     memset(dp,-1,sizeof(dp));
18     dp[0][0]=0;
19 }
20
21 void Solve(){
22     int tem=0,q=1;
23     for(int i=1;i<=n;i++){
24         tem+=p[i].b;
25         q=i;
26         if(tem>=sum1) break;
27     }
28     for(int i=1;i<=n;i++)
29         for(int j=q;j>=1;j--)
30             for(int k=sum2;k>=p[i].b;k--)
31                 if(~dp[j-1][k-p[i].b]) dp[j][k]=max(dp[j][k],dp[j-1][k-p[i].b]+p[i].a);
32     int ans=0;
33     for(int i=sum1;i<=sum2;i++) ans=max(ans,dp[q][i]);
34     cout<<q<<" "<<sum1-ans<<endl;
35 }
36
37 int main()
38 {
39     cin>>n;
40     Inite();
41     sum1=sum2=0;
42     for(int i=1;i<=n;i++){ cin>>p[i].a; sum1+=p[i].a; }
43     for(int i=1;i<=n;i++){ cin>>p[i].b; sum2+=p[i].b; }
44     sort(p+1,p+n+1);
45     Solve();
46 }
时间: 2024-10-19 21:12:25

Bottles CodeForces - 730J的相关文章

codeforces 的20道C题

A - Warrior and Archer CodeForces - 595C n  偶数  然后n个数字 A B 轮流取一个 A让差变小B让差变大 直到最后2 个   求的是最小剩下的差 最后剩下的 L R  相距 n/2    求一下最小的就行 #include <iostream> #include <cstdio> #include <cmath> #include <map> #include <algorithm> #include

【CodeForces】 730J Bottles

传送门 codeforces luogu 题目描述 Nick has n bottles of soda left after his birthday. Each bottle is described by two values: remaining amount of soda ai and bottle volume bi (ai?≤?bi). Nick has decided to pour all remaining soda into minimal number of bottl

【模拟】Codeforces 671A Recycling Bottles

题目链接: http://codeforces.com/problemset/problem/671/A 题目大意: A和B在一张二维平面上,平面上有N个垃圾,垃圾桶只有一个在T,问把所有垃圾全扔进垃圾桶最少走多远.一次只能拿一个垃圾.允许一个人走另一个人停下来. (1 ≤ n ≤ 100 000)  (0 ≤ xi, yi ≤ 109) 题目思路: [模拟] 因为每次只能携带一个垃圾,大部分垃圾都是人扔完上一个垃圾后,从垃圾桶出发去捡的. 而最多有两个垃圾不是被人从垃圾桶出发完再扔到垃圾桶.

Codeforces Round #352 (Div. 2) C. Recycling Bottles 贪心

C. Recycling Bottles It was recycling day in Kekoland. To celebrate it Adil and Bera went to Central Perk where they can take bottles from the ground and put them into a recycling bin. We can think Central Perk as coordinate plane. There are n bottle

codeforces 730 J Bottles

题目链接:https://codeforces.com/contest/730/problem/J 题意: 给你 n 瓶水,每瓶水量 ai,容量 bi.要将所有水装到尽量少的瓶子内. 每移动一单位的水要消耗一单位时间,在最少瓶子的前提下,问移动水所需的最短时间. 分析: dp 建立个三维dp[i][j][k] ( 这题刚好可以卡个 1e8 的空间 ① dp[i][j][k] 表示前 i 个瓶子 , 挑选了 j 个 , 瓶子总容量为 k 时 , 所有瓶子里最大的水量和 ② dp[i][j][k]

cf 730J. Bottles

搞一个背包,233 要求用的瓶数最少,那么就业瓶数为第一关键,当瓶数相当后再以a[i] 1 #include<bits/stdc++.h> 2 #define N 100005 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 #define ls tr[x][0] 6 #define rs tr[x][1] 7 using namespace std; 8 inline int ra() 9 { 10 int x=0,f=1; char ch

Codeforces Round #352 (Div. 2) C. Recycling Bottles(枚举)

思路:分析完这道题后会发现  当两个人捡到第一个瓶子后, 之后走的路的最小值都是不会变的了. 所以只要找出两个走到各自的第一个瓶子是最小值的情况的时候(其中还有一个人不走,一个人走的情况).   如果当有两个人或有一个人到其第一个瓶子的权值大于瓶子到回收点时,选取权值小的那个. 而且计算最小值的时候 只需取出两个权值数组中最小的两个数 即可 不用全部遍历来选取. #include<iostream> #include<cstdio> #include<cmath> #i

CodeForces 315A Sereja and Bottles(水)

#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> using namespace std; int a[200],b[200]; int vis[200]; int main() { int n; int i,j,k; while(scanf("%d",&n)!=EOF) { memset(

CodeForces 671A Recycling Bottles

#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include&