第一题:
n个人,每个人有一个初始号码,号码等于某个整数的平方就可以获奖,现在发放修改券,一张修改券可以让号码加一或者减一,想要让获奖的人达到一半,至少发多少张修改券?(n为偶数)
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int len = in.nextInt();
List<Double> list = new ArrayList<>();
int cnt = 0;
for (int i = 0; i < len; i++) {
double num = in.nextDouble();
int tmp = (int) Math.sqrt(num);
if (tmp * tmp == (int) num) cnt++;
else list.add(num);
}
List<Integer> ans = new ArrayList<>();
for (double num : list) {
int lan = (int) (Math.sqrt(num) + 0.5);
ans.add(Math.abs(lan * lan - (int) num));
// 需要几张票
}
Collections.sort(ans);
System.out.println(ans);
int res = 0, idx = 0;
len = len / 2 - cnt;
for (int i = 1; i <= len; i++) {
res += ans.get(idx++);
}
System.out.println(res);
}
第二题 dp
没写出来
n张卡牌,每张卡牌两个参数,攻击力a[i]和魔法值b[i],问选择3张卡牌i,j,k,保证i<j<k,并且a[i]<=a[j]<=a[k],问怎么选卡牌使得得到的b[i]+b[j]+b[k]最小?