include
include
include
include
using namespace std;
define maxn2 10005
define min(a,b) (a>b)? b:a
define max(a,b) (a>b)? a:b
int TT;
int N,M,K;//N个武器 M个插槽 K个jarvis支持
int vectorSize(vector V,int n){
int sum = 0;
for(int i = 0;i
bool cmp(int x1, int x2){
return x1>x2;
}
struct Node{
vector T0;//储存
vector T1;//储存
};
vector P;
int C[maxn2];
int pre_cnt[maxn2];//第i个武器插槽不使用JARVIS支持的威力
int main (){
scanf("%d",&TT);
while(TT--){
scanf("%d%d%d",&N,&M,&K);//N个武器 M个武器插槽 K个jarvis支持
P.resize(M+1);//
for(int i = 0;i<=M;i++) P.clear();
for(int i = 0;i<N;i++)
{
int temp_vv,temp_pp,temp_tt;
scanf("%d%d%d",&temp_vv,&temp_pp,&temp_tt);
if(temp_tt == 0) P[temp_pp].T0.push_back(temp_vv);//最好是把T0补0至Ci一样多 这样少了很多处理的判断
if(temp_tt == 1) P[temp_pp].T1.push_back(temp_vv);
}
for(int i = 1; i <= M; i++){
scanf("%d",&C[i]);
}
//若T0<Ci
//最好是把T0补0至Ci一样多 这样少了很多处理的判断
//判断有:直接加上T1的第一个字母或者是替换。
for(int i = 0;i <= M; i++){
int T0_size = P[i].T0.size();
for(int j = 0; j<C[i]-T0_size; j++) P[i].T0.push_back(0);
}
for(int i = 1; i<=M;i++){
sort(P[i].T0.begin(),P[i].T0.end(),cmp);
sort(P[i].T1.begin(),P[i].T1.end(),cmp);
// for(int j = 0;j
vector<int> Profit;
Profit.clear();
for(int i = 1; i<=M;i++){//第i个武器插槽
int size_0 = P[i].T0.size();//不需要JARVIS支持的武器个数
int size_1 = P[i].T1.size();//需要JARVIS支持支持的武器的个数
pre_cnt[i] = vectorSize(P[i].T0,C[i]);;//第i个武器插槽不使用JARVIS支持的总威力
//开始替换
for(int j = 0;j<size_1;j++){
if((C[i]-j-1 >= 0)&&P[i].T1[j] - P[i].T0[C[i]-j-1] > 0) Profit.push_back(P[i].T1[j] - P[i].T0[C[i]-j-1]);
}
}
int Profit_sum = 0;
//取前K个正的Profit作为利息的总值。
//for(int i = 0;i<Profit.size();i++) printf("%d \n",Profit[i]);
sort(Profit.begin(),Profit.end(),cmp);
K = min(Profit.size(),K);
for(int i = 0; i < K; i++) Profit_sum+=Profit[i];
for(int i = 1; i <= M; i++) Profit_sum+=pre_cnt[i];
printf("%d\n",Profit_sum);
}
}