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;
    }
  • 相关阅读:
    多线程之生产者和消费者模式
    python多线程之线程同步--锁
    python多线程之动态确定线程数
    python多线程之循环,调用函数等
    V8 引擎是如何工作的?
    AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解
    字节码
    V8 引擎是如何工作的?
    JavaScript arguments对象
    V8 是怎么跑起来的 —— V8 中的对象表示
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781986.html
Copyright © 2011-2022 走看看