思路:很明显贪心的方案是这样的,家里的牛奶保质期越短越早喝越好,超市的牛奶保质期越长,买它越好,家里的牛奶能不能喝完排下序就出答案了,然后就是超市的牛奶买几瓶最好,这里我们二分答案判断就好了,判断的时候不能把两个数组合并然后排序,这样每次判断都要排序会超时的,这里用点技巧就不用排序了,下面给代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<functional>
typedef long long LL;
using namespace std;
#define maxn 1000005
#define ll l,mid,now<<1
#define rr mid+1,r,now<<1|1
#define lson l1,mid,l2,r2,now<<1
#define rson mid+1,r1,l2,r2,now<<1|1
#define inf 0x3f3f3f3f
const int mod = 1e9 + 7;
int a[maxn];
int n, m, k;
struct node{
int value, id;
}b[maxn];
bool check(int num){
int now1 = 0, now2 = 0;
while (now1 + now2<n + num){
if (now1 < n){
if (now2 < num){
if (a[now1] < b[num-now2-1].value){
if ((now1 + now2) / k > a[now1])
return false;
else
now1++;
}
else{
if ((now1 + now2) / k > b[num-now2-1].value)
return false;
else
now2++;
}
}
else{
if ((now1 + now2) / k > a[now1])
return false;
else
now1++;
}
}
else{
if ((now1 + now2) / k > b[num-now2-1].value)
return false;
else
now2++;
}
}
return true;
}
bool cmp(node x, node y){
return x.value > y.value;
}
int main(){
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
for (int i = 0; i < m; i++){
scanf("%d", &b[i].value);
b[i].id = i + 1;
}
sort(a, a + n);
bool jud = true;
for (int i = 0; i < n; i++){
if (i / k>a[i]){
jud = false;
break;
}
}
if (jud){
sort(b, b + m, cmp);
int l = 1, r = m;
int ans = 0;
while (l <= r){
int mid = l + r >> 1;
if (check(mid)){
l = mid + 1;
ans = mid;
}
else{
r = mid - 1;
}
}
printf("%d\n", ans);
if (ans)
printf("%d", b[0].id);
for (int i = 1; i < ans; i++){
printf(" %d", b[i].id);
}
printf("\n");
}
else
printf("-1\n");
}