zoukankan      html  css  js  c++  java
  • 题解 P1208 【[USACO1.3]混合牛奶 Mixing Milk】

    其实根本没有一楼dalao描述的那么麻烦......

    一楼dalao其实吧,采用了一种纯属模拟的方式。

    下面是我的大跃进思想

    但是一个个地做减法是不是太慢了?(大跃进思想)
    于是我们是不是可以直接进行一个大跨步式的方法

    你的奶我直接全都要了?

    敲一个伪代码理解一下

    while (当前需要奶量)
    {
        if (奶农的提供量<=现在的需求量)
        {
            现在的需求量-奶农的提供量
            你的money-奶农的提供量*奶农的单价
            换一个奶农//这个的提供量已经=0
        }
        else
        {
            你的money-剩余需求量*奶农的单价
            需求量=0
        }
    }
    

    然后这个算法的优势就是大跃进
    让一个奶农不用分批次给你送牛奶(n--)
    直接一步到位,多快好省
    然后贴上高清打码的代码

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    typedef long long int lli;
    lli n,m,sum;
    struct nainong{
    	lli dj,num;
    	void input(){cin>>this->dj>>this->num;}
    }milk[5001],*now=&milk[1];
    bool cmp(const nainong &a,const nainong &b)
    {
    	if (a.dj!=b.dj)return a.dj<b.dj;
    	else return a.num>b.num;
    }
    
    int main()
    {
    	cin>>n>>m;
    	for (register int i=1;i<=m;i++)
    	{
    		milk[i].input();
    	}
    	sort(milk+1,milk+m+1,cmp);
    	while (n)//当任务还没有完成的时候
    	{
    	    if (now->num<=n)//如果这个奶农产出的奶不够用
    	    {
    	        n-=now->num;//减掉这个奶农的产量(我全都要了qwq)
    	        sum+=(now->dj)*(now->num);//加上这个奶农的要价
    	        now++;//移动到下一个位置(or——奶农qwq)
    	    }
    	    else//奶农产出的奶量不足(任务即将完成)
    	    {
    	        sum+=(now->dj)*n;//买到最后的奶
    	        n=0;//任务完成
    	    }
    	}
    	cout<<sum;
    	return 0;
    }
    

    然后呢,看看两个代码之间的差距:

    (十分建议@chen_zhe 数据加强卡一下,逃qwq)

  • 相关阅读:
    集训总结
    目前世界四大杀毒软件各自的特点
    俺们家老祖宗是搞音乐的
    灰姑娘
    自欺欺人的ie7pro去掉msnlivespaces的顶部广告图片
    利用工具及api接口写博文
    在C#中,异步调用的WebService、Socket及新建线程中操作主线程中UI的方法
    Ubuntu 12.04下载址
    js与php互传参数
    php使用strstr函数 ,判断字符串A中是否含有字符串B
  • 原文地址:https://www.cnblogs.com/jelly123/p/10423906.html
Copyright © 2011-2022 走看看