广联达笔试8-19
单选题
30道单选和三道编程题总分一样,都是60分。
30道单选做了45分钟左右,里面求程序执行结果的题有不少,考的也比较全面。
记录一题懵逼的题:思路先回到大一学的《离散数学》,又回到研一学的《凸优化》,但还是没有头绪,怒抄之。
在互为对偶的两个问题中,若一个问题可行且具有无界解,则另一个问题()
A. 有多重最优解
B. 有无界解
C. 有唯一最优解
D. 无可行解
第一题
思路:双指针
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s1 = input.nextLine();
String s2 = input.nextLine();
int res = 0, len = s1.length();
int idx1 = 0, idx2 = 0;
while (idx1 < len && idx2 < len) {
if (s1.charAt(idx1) == s2.charAt(idx2))
res += 20;
if (s1.charAt(idx1) != s2.charAt(idx2)) {
if (res >= 10)
res -= 10;
else res = 0;
}
idx1++;
idx2++;
}
System.out.println(res);
}
}
第二题
草草读了一下题就返回第一题,然后接着第三题去了。现在也不知道第二题讲的什么,只模模糊糊地记得魔法士,真正的粉丝,看到魔法士就第三题
典型的背包问题。
思路:动态规划。
难点:在于 dp 数组中下标为浮点数时的转化。
考虑到最后求的是 最大取悦值,跟另一个变量,也就是电量关系不太大,猜测测试用例可能都是两位小数,索性直接乘了一百全当成整数算,没想到竟然过了。
有点投机取巧。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int C = input.nextInt() * 100;
float[] c = new float[n];
int[] w = new int[n];
int[] tmp = new int[n];
for (int i = 0; i < n; i++) {
c[i] = input.nextFloat();
w[i] = input.nextInt();
tmp[i] = (int) (c[i] * 100);
}
int[] dp = new int[C + 1];
for (int i = 0; i < n; i++)
for (int j = C; j >= tmp[i]; j--)
dp[j] = Math.max(dp[j - tmp[i]] + w [i], dp[j]);
System.out.println(dp[C]);
}
}
