E1. Reading Books (easy version)
题意:
给 N 个数,每个数有 3 个属性:int 值 X ,bool 值 A ,bool 值 B ,问能不能在使 X 总和最小的情况下找到 K 个 A 值为 1 和 K 个 B 值为 1 的数
思路:
暴力,如果AB都为1存进数组 t 里,如果只有 A 是 1 就存进数组 a 里,如果只有 B 是 1 就存进数组 b 里,然后3个数组排序后比较 t[ti] 和 a[ai]+b[bi],得到 sum 输出即可(得不到 K 个就输出 -1)
代码附:
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h>
#define int long long
using namespace std;
using ll = long long ;
const int N = 2e5+10;
int A[N],B[N],T[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,k,a=0,b=0,t=0,x,aa,bb;
cin>>n>>k;
for(int i=0; i<n; ++i)
{
cin>>x>>aa>>bb;
if(aa&&bb)
T[t++]=x;
else if(aa)
A[a++]=x;
else if(bb)
B[b++]=x;
}
if(a+t<k||b+t<k)
{
cout<<-1;
return 0;
}
sort(A,A+a);
sort(B,B+b);
sort(T,T+t);
int sum=0;
int ti=0,ai=0,bi=0;
while(k--)
{
if(ti<t&&ai<a&&bi<b)
{
if(T[ti]<=A[ai]+B[bi])
sum+=T[ti++];
else
sum+=A[ai++]+B[bi++];
}
else if(ti==t)
sum+=A[ai++]+B[bi++];
else
sum+=T[ti++];
}
cout<<sum;
return 0;
}