zoukankan      html  css  js  c++  java
  • Weights and Measures (贪心+dp)

    I know, up on top you are seeing great sights,
    But down at the bottom, we, too, should have rights.
    We turtles can’t stand it. Our shells will all crack!
    Besides, we need food. We are starving!” groaned Mack.
    Mack, in an effort to avoid being cracked, has enlisted your advice as to the order in which turtles
    should be dispatched to form Yertle’s throne. Each of the five thousand, six hundred and seven turtles
    ordered by Yertle has a different weight and strength. Your task is to build the largest stack of turtles
    possible.
    Input
    Standard input consists of several lines, each containing a pair of integers separated by one or more
    space characters, specifying the weight and strength of a turtle. The weight of the turtle is in grams.
    The strength, also in grams, is the turtle’s overall carrying capacity, including its own weight. That is,
    a turtle weighing 300g with a strength of 1000g could carry 700g of turtles on its back. There are at
    most 5,607 turtles.
    Output
    Your output is a single integer indicating the maximum number of turtles that can be stacked without
    exceeding the strength of any one.
    Sample Input
    300 1000
    1000 1200
    200 600
    100 101
    Sample Output
    3
    思路:先按照载重从小到大排序,然后dp即可,状态转移方程dp[t][j] = min(dp[t][j], dp[t-1][j-1] +p[t].a)。

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #define INF 0x3f3f3f3f
    using namespace std;
    
    struct node {
    	int a,b;
    
    } p[10005];
    long long int dp[10005][10005];
    bool cmp(node x,node y)
    {
    	return x.b<y.b;
    }
    int main() {
    	int n=1;
    	while(scanf("%d%d",&p[n].a,&p[n].b)!=EOF) {
    		n++;
    	}
        n--;
        for(int t=0;t<=n;t++)
        {
        	for(int j=1;j<=n;j++)
        	{
        		dp[t][j]=INF;
    		}
    	}
    	sort(p+1,p+n+1,cmp);
        for (int t = 1; t <= n; t ++)
    	for (int j = 1; j <= t; j ++) {
    	    dp[t][j] = dp[t-1][j];
    	    if (dp[t-1][j - 1] + p[t].a <= p[t].b && dp[t-1][j-1] !=INF)
    		dp[t][j] = min(dp[t][j], dp[t-1][j-1] +p[t].a);
    	}
        int flag;
    	for(int k=n;k>=1;k--)
    	{
    		if(dp[n][k]!=INF)
    		{
    			flag=k;
    			break;
    		}
    	}
        printf("%d
    ",flag);
    	return 0;
    }
  • 相关阅读:
    常用Git命令清单
    上海金瑢信息有限公司面试
    上海视频面试
    bootstrp-3.0
    B站小姐姐面试分享2
    B站小姐姐分享第一次电话面试
    Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组。
    findIndex
    es5,es6
    es6数组去重
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781985.html
Copyright © 2011-2022 走看看