B - プライオリティキューPOJ - 2970

1.タイトルPOJ - 2970

(ARTの単純マスターズ)、SMARTと呼ばれる新しいウェブデザインスタジオは、2人を採用しています。最初の1は、Webデザイナーと同時にエグゼクティブ・ディレクターです。もう一つは、プログラマです。監督はそのスタジオは、すでにウェブサイトの開発のためのNの契約を持っていることを軽快な男です。各契約は期限ジを持っています。
プログラマが怠惰であることが知られています。通常、彼は早く彼ができるように動作しません。したがって、通常の条件下では、プログラマは、契約番号iを実行するために、時間のBI必要があります。幸いなことに、男はお金のための非常に貪欲です。(BI - XI AI)のディレクターは彼が余分なドルを支払うXI場合は、彼が唯一必要と彼の仕事をする時間を。しかし、この余分な支払いは、他の契約に流入しません。これは、各契約が速く行われるように、別途支払わなければならないことを意味します。プログラマは、余分な支払いが契約番号iのために(BI / aiを)ドルであれば、彼はほぼ瞬時に彼の仕事をすることができるように貪欲です。
ディレクターは解決が難しい問題があります。彼は、プログラマの仕事を整理すると、すべての契約が時間内に行われるように契約の一部について、割り当ての余分な支払いかもしれ必要です。明らかに、彼は余分な支払いの合計を最小化することを希望します。ディレクターを助けて!

入力
入力の最初の行は、契約の数N(1≤N≤100 000、整数)を含みます。次のN行のそれぞれの契約を説明し、数字がaiは整数含まれ、BI、ジ(1- aiを≤、BI≤10 000; 1≤ジ≤1 000 000 000)がスペースで区切られました。

出力
出力は、ファイルの行だけで、単一の実数Sを含める必要があります。Sは、ディレクターが余分なので、プログラマが時間内にすべての契約を行うことができることを支払う必要があるお金の最小合計です。数は、小数点以下2桁を持っている必要があります。

サンプルインプット
2
20 50 100
10 100 50
出力例
5.00

効果2.被験者
完了するn個のタスクは、各タスクが、Bの属性を持ち、dは
追加賃金を表し、時間は、作業、時間の終わりを完了するために必要。
仮定はお金を与えることはありません。そして、完了時間が余分に支払うことをX、その後、完了時間がBA * X bはなり、Bである
お金の最低額の必要性を完了するために、それぞれの期限までにすべてのタスクに求める
3.問題解決のアイデア
終了時間d内のすべてのタスクソートし、次に時間内にタスクを完了するためには終了しました。現在のタスクが完了できない場合は、タスクが最大のタスクを見つけるために完了する前に、発見されなければならない、時間を短縮する作業が作業を完了するために必要なお金を追加することによって(すなわち、時間は、Bは、B-AXになり、作業を完了するために必要)。あなたはメンテナンスのため、このAのプライオリティキューを使用する必要がある場合。
4.プライオリティキューの内容
https://blog.csdn.net/weixin_36888577/article/details/79937886
5. ACコード

#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<cstring>
#include<string>
#include<queue>
#define LL long long int
#define mst(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn=1e5+10;
struct one
{
    LL ai,bi,di;
    bool operator < (const one &s) const//在这个队列中按照ai从大到小排列,大的在前面
    {
        return s.ai > ai;
    }

}a[maxn];
bool cmp(one a, one b)
{
    return a.di < b.di;//sort排序时以此作为根据
}
//priority_queue优先队列,插入进去的元素都会从大到小排好序
//priority_queue<int, vector<int>, cmp>q;    //定义方法
//priority_queue<LL,vector<LL>,greater<LL> >q;
//其中,第二个参数为容器类型。第三个参数为比较函数。
priority_queue<one>q;
int main()
{
  int n ;   scanf("%d" ,&n);
  for(int i =0; i<n; i++)
  {
      scanf("%lld%lld%lld",&a[i].ai,&a[i].bi,&a[i].di);
  }
   double fin=0;
   sort(a,a+n,cmp);//将所有任务按照截止时间的先后排序
   LL sum =0;
   for(int i =0; i < n ; i++)
   {
       sum+=a[i].bi;// 时间的流逝
       q.push(a[i]);
       while(!q.empty() && sum > a[i].di)//如果加上这个任务所需要的时间后,会超出截止时间
       {
           one temp = q.top();
           q.pop();
           if(sum - a[i].di > temp.bi) //如果所有已经完成的任务中ai最大的任务的bi就算全部弄掉都还会超出截止时间
           {
               sum -= temp.bi; //把ai最大的这个任务的全部所需时间减掉,都还会超出截止时间。
               fin += temp.bi*1.0/temp.ai;    //额外的钱等于=b/a;
           }
           else //把ai最大的那个任务快点完成就不会超出截止时间
           {
               fin += (sum-a[i].di)*1.0/temp.ai;
               temp.bi -= (sum - a[i].di);
               sum = a[i].di;//使目前的时间正好等于目前任务的截止时间
               q.push(temp);
           }
       }
   }
   printf("%.2f\n",fin);//f,lf????????
    return 0;
}



リリース元の2件の記事 ウォンの賞賛0 ビュー50

おすすめ

転載: blog.csdn.net/weixin_45674799/article/details/104352995