#P1048. 新年的年货
新年的年货
作为小县城唯一卖年货的人,你的眼里总透着同龄人不懂的敏锐。每次看有人来置办年货,你都会凝神观察:“你喜欢哪些物件?我给你卖贵点。”
最后一天,当你准备收摊回家过年时,迎面走来福马。听闻你独特的奸商之道,他笑说:“我们来玩一个游戏吧!如果你足够聪明,能猜出我喜欢哪些物件,我就把你这摊位的年货全部买走!”你欣然同意,于是他讲起了游戏规则:
福马在心中对你卖的 $n$ 件年货按他喜爱程度排序,其中第 $i$ 个物品的喜爱程度为 $v_i$,代表这是他第 $n+1-v_i$ 喜欢的物品。而你每次可以给每个物品设定售卖价格 $w_i$ 元,然后交给福马 $W$ 元钱,他会如实用不超过 $W$ 元钱向你买一些物品,并使他对这些物品的喜爱程度之和最大。
你需要在不超过 $Q$ 次定价后回答福马心中对每个物品的喜爱程度,如果超出次数限制,他会认为你不够聪明,然后离开。为了让你在过年前大赚一笔,你决定编写一个程序辅助你猜测。
题目描述
这是一道交互题
给出 $n$ 个物品,编号为 $0\sim n-1$,其价值 $v_i$ 构成 $1\sim n$ 的 $n$ 阶排列,你需要通过询问猜出这个排列。你可以第 $i$ 个物品赋予一个重量 $w_i$ 和总重量上限 $W$,其中需要满足 $0\le w_i\le n,0\le W\le n^2$。交互库会返回满足重量和不超过总重量上限的子集中价值和最大的子集,如有多个会任意返回其中一个。
你需要在不超过 $Q$ 次询问后回答每个物品的价值。
实现细节
请使用 C++ 语言提交
你不需要,也不应该实现主函数,你需要包含头文件 bag.h。
你只需要实现函数 vector<int> guess(int n,int Q) ,其接收物品数量 $n$ 和最大猜测次数 $Q$,返回一个长为 $n$ 的 vector 代表你猜测的排列 $v$。
你可以调用函数 vector<int> query(vector<int> w,int W) , 其接收一个长为 $n$ 的数组 $w$ 和重量上限 $W$,返回一个长为 $n$ 的 $0/1$ 数组 $c$,其中若 $c_i=1$ 则代表最优方案包括物品 $i$,否则代表最优方案不包括物品 $i$。
为了方便你的实现,我们提供了以下模板,你需要修改模板中的 vector<int> guess(int n,int Q) 函数,正解不依赖模板。以下代码没有意义,请勿直接提交。
#include<bits/stdc++.h>
#include"bag.h"
using namespace std;
vector<int> guess(int n,int Q){
vector<int> ans(n),w(n);
for(int i=0;i<n;++i) ans[i]=i+1,w[i]=1;
vector<int> c=query(w,n);
if(c[0]==1) swap(ans[0],ans[n-1]);
return ans;
}
你可以从"附件下载"中得到以上模板代码,你也可以从"附件下载"中得到本地测试用交互库,使用方法为将你的代码直接粘贴到交互库中,依次输入 $n,Q,v_i$,运行即可。评测用交互库与下发有所不同。
交互示例
你的程序
query([1,2],1)query([2,1],2)
return [1,2]
交互库
guess(2,2)</p>return [1,0]
return [0,1]
1 2
样例解释
样例给出了一种可能的交互过程,答案为 $v=[1,2]$。
第一次查询,给出 $w=[1,2],W=1$,显然只有仅包含物品 $0$ 的集合符合条件,交互库返回 $[1,0]$。
第二次查询,给出 $w=[2,1],W=2$,显然只有仅包含一个物品的集合符合条件,而物品 $1$ 权值大于物品 $0$,交互库返回 $[0,1]$。
于是我们得到了 $v_0 < v_1$,可以得到答案为 $v=[1,2]$。
数据范围
对于全部数据,满足 $1\le n \le 256$。保证你的程序至多被调用一次。
| 子任务编号 | $n$ | $Q=$ | 总分 |
|---|---|---|---|
| $1$ | $\le 10$ | $50$ | $5$ |
| $2$ | $\le 25$ | $50$ | $5$ |
| $3$ | $\le 51$ | $50$ | $10$ |
| $4$ | $=64$ | $50$ | $6$ |
| $5$ | $\le 64$ | $50$ | $6$ |
| $6$ | $=64$ | $32$ | $6$ |
| $7$ | $\le 64$ | $32$ | $6$ |
| $8$ | $=64$ | $14$ | $12$ |
| $9$ | $\le 64$ | $14$ | $12$ |
| $10$ | $=256$ | $8$ | $16$ |
| $11$ | $\le 256$ | $8$ | $16$ |
时间限制:1s (交互库时间不超过 0.2s)
空间限制:256MB (交互库使用不超过 32MB)