Practice
A. Absolute Maximization
题意
给定一个数组
思路
既然可以无限次交换,那么我们只要找出最高位,从最高位开始往下找,只要有一个元素该位存在
时间复杂度:
对应AC代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
for(int w=0;w<t;w++){
int n = scanner.nextInt();
int[] min = new int[12], max = new int[12];
for(int i=0;i<12;i++){
min[i] = 1;
max[i] = 0;
}
int maxLen = 0;
String[] input = new String[n];
for(int i=0;i<n;i++) {
input[i] = Integer.toBinaryString(scanner.nextInt());
maxLen = Math.max(maxLen, input[i].length());
}
for(int i=0;i<n;i++) {
while(input[i].length() != maxLen) input[i] = "0" + input[i];
for(int j=0;j<maxLen;j++) {
int now = input[i].charAt(j) - '0';
max[j] = Math.max(max[j], now);
min[j] = Math.min(min[j], now);
}
}
int maxx = 0, minn = 0;
for(int i=0;i<maxLen;i++) {
maxx = maxx * 2 + max[i];
minn = minn * 2 + min[i];
}
System.out.println(maxx - minn);
}
}
}
简单思维题
B. Incinerate
题意
给定
思路
模拟。
我们可以先按照生命值升序排序,维护一个存活的怪物的开始下标
时间复杂度:
对应AC代码
import java.util.*;
public class Main {
private static class Monster{
int h, p;
Monster(int h){
this.h = h;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
for(int w=0;w<t;w++){
int n = scanner.nextInt(), k = scanner.nextInt();
Monster[] m = new Monster[n];
for(int i=0;i<n;i++) m[i] = new Monster(scanner.nextInt());
for(int i=0;i<n;i++) m[i].p = scanner.nextInt();
Arrays.sort(m, Comparator.comparingInt(o -> o.h));
int[] suf = new int[n + 1];
suf[n] = Integer.MAX_VALUE;
for(int i=n-1;i>=0;i--) suf[i] = Math.min(suf[i + 1], m[i].p);
int index = 0, attack = 0;
while(k > 0){
for(int i=index;i<n;i++){
if(m[i].h - attack > k) break;
index ++;
}
if(index >= n) break;
attack += k;
k -= suf[index];
}
System.out.println(k > 0 ? "YES" : "NO");
}
}
}
略微暴力但又不暴力(
C. Another Array Problem
题意
给定一个数组
思路
我们来考虑一下
在这个情况里,我们不妨找出最大值所在的下标
也就是说,我们只需找出最大的值,最后一定有方案将所有数全都改为最大值。
那么
同上,两个数的时候,最大值即为两个元素的差。
当然,我们也可以不操作,所以需要取一下操作后的答案和原总和的最大值。
时间复杂度:
对应AC代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
for(int w=0;w<t;w++){
int n = scanner.nextInt();
long[] a = new long[n];
int maxIndex = 0;
long sum = 0;
for(int i=0;i<n;i++){
a[i] = scanner.nextLong();
sum += a[i];
maxIndex = a[maxIndex] < a[i] ? i : maxIndex;
}
long ans;
if(n == 2) {
ans = Math.abs(a[1] - a[0]) * 2;
}else if(n == 3){
if(maxIndex == 0 || maxIndex == 2) ans = a[maxIndex] * n;
else{
long min = Math.min(a[0], a[2]), sMin = Math.max(a[0], a[2]);
ans = Math.max(a[maxIndex] - min, sMin) * 3;
}
}else ans = a[maxIndex] * n;
System.out.println(Math.max(sum, ans));
}
}
}
很巧妙的思维题
- 本文链接 https://floating-ocean.github.io/blog_old/posts/1344553303/
- 版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!