poj 2904 The Mailboxes Manufacturers Problem(DP)

The Mailboxes Manufacturers Problem
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 947   Accepted: 685

Description

In the good old days when Swedish children were still allowed to blowup their fingers with fire-crackers, gangs of excited kids would plague certain smaller cities during Easter time, with only one thing in mind: To blow things up. Small boxes were easy to blow up, and thus mailboxes became a popular target. Now, a small mailbox manufacturer is interested in how many fire-crackers his new mailbox prototype can withstand without exploding and has hired you to help him. He will provide you withk (1 ≤ k ≤ 10) identical mailbox prototypes each fitting up to m (1 ≤m ≤ 100) crackers. However, he is not sure of how many firecrackers he needs to provide you with in order for you to be able to solve his problem, so he asks you. You think for a while and then say, “Well,if I blow up a mailbox I can’t use it again, so if you would provide me with only k = 1 mailboxes, I would have to start testing with 1 cracker, then 2 crackers, and so on until it finally exploded. In the worst case, that is if it does not blow up even when filled with m crackers, I would need 1 + 2 + 3 + … + m = m × (m + 1) ⁄ 2 crackers. Ifm = 100 that would mean more than 5000 fire-crackers!” “That’s too many,” he replies. “What if I give you more thank = 1 mailboxes? Can you find a strategy that requires less crackers?”

Can you? And what is the minimum number of crackers that you should ask him to provide you with?

You may assume the following:

  1. If a mailbox can withstand x fire-crackers, it can also withstand x − 1 fire-crackers.
  2. Upon an explosion, a mailbox is either totally destroyed (blown up) or unharmed, which means that it can be reused in another test explosion.

Note: If the mailbox can withstand a full load of m fire-crackers, then the manufacturer will of course be satisfied with that answer. But otherwise he is looking for the maximum number of crackers that his mailboxes can withstand.

Input

The input starts with a single integer N (1 ≤ N ≤ 10) indicating the number of test cases to follow. Each test case is described by a line containing two integers:k andm, separated by a single space.

Output

For each test case print one line with a single integer indicating the minimum number of fire-crackers that is needed, in the worst case, in order to figure out how many crackers the mailbox prototype can withstand.

Sample Input

4
1 10
1 100
3 73
5 100

Sample Output

55
5050
382
495
 
  
题意:给出k个完全相同邮筒,每个邮筒理论上能承受的火药量为m。现在要测试这些邮筒的实际能承受的火药量是否真的为m,则需要多少数量的火药。如果在测试过程中邮筒爆破了,则不能继续使用这个邮筒,如果邮筒完好无损,则下一次实验能继续使用。所以只有一个邮筒时,则需要从1到m逐个去试验,这样的话就算那个邮筒爆破了,也能知道它实际的承受火药量。但是如果给出多于1个邮筒,则可以直接从t>=1开始试验,因为就算一个邮筒爆破了,还有另外的邮筒供试验。
思路:当只有一个邮筒时,需要的火药显然为1+2+3+...+m,这样才能测出邮筒的实际能承受的火药量。但是当给出邮筒数增多时,则不需要那么多的火药。设dp[k][i][j]表示给出k个邮筒,承受火药量试验范围为[i,j]时所需的火药数量。
设给出k个邮箱,第一次测试t的火药数量,有两种情况:
(1)若邮筒爆破了,则下次测试范围为[i,t-1],所需火药量为dp[k-1][i][t-1];
(2)若邮筒完好无损,则下次测试范围为[t+1,j],所需火药量为dp[k][t+1][j].  (若邮筒完好无损,则能继续使用)
因为不知道邮筒是否会爆破,所以要作最坏打算,从上面两种情况中选择所需火药量最大的情况,枚举t,在这些最大的情况中选择所需火药量最少的。
 
 
  
AC代码:
 
  
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define max2(a,b) ((a) > (b) ? (a) : (b))
#define min2(a,b) ((a) < (b) ? (a) : (b))

using namespace std;

const int INF=10000000;
int main()
{
    int dp[15][105][105];
    for(int i=1;i<=100;i++)
    for(int j=i;j<=100;j++)
    dp[1][i][j]=(j-i+1)*(i+j)/2;

    for(int k=2;k<=10;k++)
    for(int j=100;j>=1;j--)
    for(int i=j;i>=1;i--)
    {
        dp[k][i][j]=INF;
        for(int t=i;t<=j;t++)
        dp[k][i][j]=min(dp[k][i][j],t+max(dp[k-1][i][t-1],dp[k][t+1][j]));
    }
    int k,m,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&k,&m);
        printf("%d\n",dp[k][1][m]);
    }
    return 0;
}


你可能感兴趣的:(poj,动态规划)