思路:对优惠按满的钱进行排序,然后分别计算出每一次点外卖的钱,最后相加,详见代码
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
struct note
{
int x,y;
};
int cmp(note aa,note bb)
{
return aa.x<bb.x;
}
note a[100000],b[100000];
int main()
{
//freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a,a+n,cmp);
for(int i=0;i<m;i++)
{
scanf("%d",&b[i].x);
b[i].y = b[i].x;
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(b[i].x<a[j].x)
break;
b[i].y = min(b[i].y,b[i].x-a[j].y);
}
}
int ans = 0;
for(int i=0;i<m;i++)
ans+=b[i].y;
printf("%d\n",ans);
}
}