• 【题解】「UVA1149」装箱 Bin Packing


    做法显然:贪心,但是怎么贪?

    1. 首先从大到小或从小到大排序,窝这次是从大到小排,这样更容易理解(从小到大更方变)

    2. 然后设置两个变量 frontafter 作为前指针和后指针。

    3. 循环判断:

      • 当前后两个数能放入背包时,则 ans++ 并把两指针:

        front++;
        after--;
        
      • 当不能同时放入时,放进大的那个,也就是前面的那个,并且 ans++, front++;

    最后看一下code:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int NR = 1e5 + 5;
    int t, n, m, v[NR], front, after, ans;
    bool cmp(int x, int y)
    {
    	return x > y;
    }
    void Initialization()//每组数据前后初始化
    {
    	memset(v, 0, sizeof(v));//清零
    	n = 0;
    	m = 0;
    	front = 1;
    	after = 0;
    	ans = 0;
    }
    void Cin()//每组数据的输入
    {
    	cin >> n >> m;
    		for (int i = 1; i <= n; i++)
    			cin >> v[i];
    	after = n;
    }
    int main()
    {
    	cin >> t;
    	Initialization();//初始化
    	for (int T = 1; T <= t; T++)
    	{
    		Cin();//输入
    		sort(v + 1, v + n + 1, cmp);//排序
    		for (int i = 1; i <= n; i++)//循环n次,因为最多分配n次,不会超过n次
    			if (front >= after)//如果前指针已经超过或等于后指针时说明已经结束,所以结束循环
    			{
    				ans++;
    				cout << ans << endl;//输出答案
    				Initialization();//初始化
    				break;
    			}
    			else if (v[front] + v[after] <= m)
    			{//如果前后两个物品能放下
    				ans++;
    				front++;//前指针向后移
    				after--;//后指针向前移
    			}
    			else
    			{//否则的话
    				ans++;
    				front++;//只有前指针向后移
    			}
    	}
    	return 0;
    }
    
    

    求赞ฅʕ•̫͡•ʔฅ

  • 相关阅读:
    selenium 在爬虫中的应用
    基于scrapy-redis的第二种形式的分布式爬虫(把普通scrapy框架转成分布式)
    django html 模板继承(下)加精
    django页面之间的前端模板继承或者引入详解(上)
    inclusion_tag 重复页面加载显示模板
    django ForeignKey ManyToManyField OneToOneField
    django建站的注意点
    任务19
    数列求和
    鸡兔同笼2
  • 原文地址:https://www.cnblogs.com/-TNT-/p/13196512.html
Copyright © 2020-2023  润新知