PA2014-최종 램프

효과에 따라 

 

보고서 문제 해결

  • (题意)拥有的灯泡功率必须大于等于需要的,有k次机会换拥有的功率
  • 换的次数少于 需要换的灯泡数 时,输出NIE无解
  • 并不是一一对应的关系,因为这个灯泡可能其他拥有的的灯泡满足,而功率数可能更小; 也有可能没有灯泡可以给他用;
  • 그래서 우리는 오히려 같은 견본과 같은 작은 전구 (에 대한 수요보다 작은 사용자를위한 큰 수요 램프 전력의 높은 전력 전구를 충족 할 수 있어야한다 ((7 줄 안) (7) (수요를 제공해야합니다)가 수요) 5)
  • "다음 사용할 수있는 작은 전구는 예약을 사용할 수 없습니다."
复制代码
#include<bits/stdc++.h>
using namespace std;

#define fr(i,z) for(int i = 1; i <= z; i++)

const int N = 500500;
int n,k,j = 1;
int p[N],w[N];
long long ans;

priority_queue<int > t;
priority_queue<int,vector<int>,greater<int> > q;

bool cmp(int a,int b){return a>b;}  

int main()
{
    scanf("%d%d",&n,&k);
    fr(i,n)   scanf("%d",p + i);    
    fr(i,n)   scanf("%d",w + i);  
    sort(p + 1, p + n + 1, cmp);
    sort(w + 1, w + n + 1, cmp); //要从大到小比较,为了获得能满足要求的最小功率的灯泡
    
    fr(i,n){
        while(p[j] >= w[i])   q.push(p[j++]);  //把可以满足的都扔进堆里
        
        if(!q.empty()){  
            ans += q.top();  
            t.push(q.top() - w[i]);  //要记下差值,以便后面换灯泡
            q.pop();
            continue;
        }
         
        k--;  //计数,判断是否无解 以及 最后剩余的更改数
        ans += w[i];  //如果确定要换,那肯定是换等于需求功率的
        if(k < 0) {   //判断无解
        cout << "NIE";
        return 0;
        }
    }
    while(k--){  
        ans -= t.top();  //换的思路都是相同的
        t.pop();
    }
    cout << ans;
}

 

 

PA2014-Final Zarowki

추천

출처www.cnblogs.com/aprincess/p/11621574.html