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;
    }
  • 相关阅读:
    HDU 1859
    基本排序算法学习
    SQL 从指定表筛选指定行信息 获取表行数
    华为 2015 笔试题练习
    HDU 1003 maxsum
    $.ajax()方法详解
    【jQuery】jQ处理xml文件和xml字符串
    虚方法与抽象方法有什么区别
    System.IO.Path类
    FileAttributes枚举
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781986.html
Copyright © 2011-2022 走看看