Input starts with an integer T (≤ 50), denoting the number of test cases.
Each case starts with a line containing four integers n x y z as described in the statement. You may assume that 1 < n ≤ 1000 and 1 ≤ x, y, z ≤ 105 and x is even.
标签:
Time Limit: 20 Sec Memory Limit: 256 MB
http://www.lightoj.com/volume_showproblem.php?problem=1381
John wants to be a scientist. A first step of becoming a scientist is to perform experiment. John has decided to experiment with eggs. He wants to compare the hardness of eggs from different species. He has decided to use a nearby large multi-storied building for this purpose. For each species he will try to find the highest floor from which he can drop the egg and it will not break. The building has (n+1) floors numbered from 0 to n. John has a book from which he knows that
Unfortunately John has a few problems:
These problems are not going to tame John‘s curious mind. So he has decided to use an optimal strategy and minimize his cost in worst case. As John is not a programmer, he asked your help.
Input starts with an integer T (≤ 50), denoting the number of test cases.
Each case starts with a line containing four integers n x y z as described in the statement. You may assume that 1 < n ≤ 1000 and 1 ≤ x, y, z ≤ 105 and x is even.
Output
For each test case, print the case number and the minimized worst case cost.
7
4 2 998 1000
16 2 1000 1000
16 1000 1 1
4 1000 1 1
7 2 2 2
9 2 1 100
11 2 100 1
Case 1: 2000
Case 2: 4008
Case 3: 1015
Case 4: 1003
Case 5: 10
Case 6: 24
Case 7: 111
For case 1, John knows that the egg will break if dropped from 4th floor, but will not break if dropped from 0th floor. An optimal solution may be
So, using this strategy, his worst case cost is ¢2000.
题意
一个评估蛋的硬度方法是测量蛋从多高摔下来会碎。现在佳佳想以楼层高度作为考量依据评估蛋的 硬度。如果蛋从i楼上掉下来会碎,而i-1不会,那么蛋的硬度为i。高为n层的实验楼里面有蛋卖,一个X元。佳佳开始没有蛋,并且他只能随身携带一个蛋, 不带蛋进楼需要Y元,带蛋需要Z元,做完试验之后如果还有一个蛋,可以卖掉得X/2元(卖蛋不需要进楼)。佳佳把鸡蛋扔出去后,会出楼检查蛋的情况。如果 蛋扔下后没有碎掉,佳佳一定会把蛋捡起,然后进楼,如蛋碎掉了,佳佳就不会管它。 佳佳想知道在最糟糕的情况下,测出蛋的硬度最少需要花费多少钱。
题解:
dp[i]表示在楼层高度为i的情况下,检测出碎蛋的位置的最小最差花费是多少
然后转移就好,注意这个dp[i]只和楼层高度有关!
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 200001 #define mod 10007 #define eps 1e-9 int Num; char CH[20]; //const int inf=0x7fffffff; //нчоч╢С const int inf=0x3f3f3f3f; /* inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } */ inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } //************************************************************************************** ll dp[maxn]; ll d1,d2; int n,x,y,z; int main() { int t=read(); for(int cas=1;cas<=t;cas++) { n=read(),x=read(),y=read(),z=read(); dp[0]=dp[1]=0; for(int i=2;i<=n;i++){ dp[i]=inf; for(int j=1;j<i;j++) { d1=dp[j]+x+y; d2=dp[i-j]+z; if(i-j==1) d2=y+x/2; dp[i]=min(dp[i],max(d1,d2)); } } printf("Case %d: %lld\n",cas,dp[n]); } }
lightoj 1381 - Scientific Experiment dp
标签:
原文地址:http://www.cnblogs.com/qscqesze/p/4526916.html