1056F - Write The Contest - CodeForces Solution


binary search dp math *2500

Please click on ads to support us..

C++ Code:

#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long double ldb;
const int mxn=105;
int n,m,i,j,t,k,s;
db dp[mxn][mxn*10],c,ti;
struct node
{
db dif;int pt;
}a[mxn];
bool cmp(node x,node y){return x.dif<y.dif;}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d%lf%lf",&n,&c,&ti);
for (i=1;i<=n;++i) scanf("%lf%d",&a[i].dif,&a[i].pt);
sort(a+1,a+n+1,cmp);
for (j=0;j<=n;++j)
for (i=0;i<=n*10;++i) dp[j][i]=1e18;
s=0;dp[0][0]=0.0;
for (i=1;i<=n;++i)
{
for (k=i-1;k>=0;--k)
for (j=s;j>=0;--j)
dp[k+1][j+a[i].pt]=min(dp[k+1][j+a[i].pt],dp[k][j]*10.0/9.0+a[i].dif*10.0/9.0);
s+=a[i].pt;
}
int ans=0;
for (i=0;i<=n;++i)
for (j=0;j<=s;++j)
{
db tmp;
if (dp[i][j]>=1.0/c) tmp=2.0*sqrt(dp[i][j]/c)-1.0/c;
else tmp=dp[i][j];
if (tmp+i*10.0<=ti) ans=max(ans,j);
}
printf("%d\n",ans);
}
return 0;
}


Comments

Submit
0 Comments
More Questions

1671C - Dolce Vita
1669G - Fall Down
4D - Mysterious Present
1316B - String Modification
1204A - BowWow and the Timetable
508B - Anton and currency you all know
1672A - Log Chopping
300A - Array
48D - Permutations
677C - Vanya and Label
1583B - Omkar and Heavenly Tree
1703C - Cypher
1511C - Yet Another Card Deck
1698A - XOR Mixup
1702E - Split Into Two Sets
1703B - ICPC Balloons
1702F - Equate Multisets
1700A - Optimal Path
665C - Simple Strings
1708A - Difference Operations
1703E - Mirror Grid
1042A - Benches
1676B - Equal Candies
1705B - Mark the Dust Sweeper
1711A - Perfect Permutation
1701B - Permutation
1692A - Marathon
1066A - Vova and Train
169B - Replacing Digits
171D - Broken checker