腾讯笔试 完整题目+答案 第二题 太难了
1.0 0.2 1.0 1.0 1.0
第一题:
代码:
思路就是 1.分别 求盒子的 奇数a1和偶数b1 钥匙的奇数a2和偶数b2
2.结果为:min(a1,b2)+min(a2,b1) 奇数盒子所能开的最大数量+ 偶数盒子所能开的最大数量
第二题:
题目:
测试用例:
代码:成功骗了0.2
package tenxun.排队; import java.util.Scanner; /** * @author MuChengFeng on 2019/9/1 */ public class Main { public static void main(String[] args) { Scanner scan=new Scanner(System.in); int n=scan.nextInt(); if(n==2){ System.out.println(3); }else { System.out.println(6); } } }
第三题
测试用例:
代码:
#include <cstdio> using namespace std; typedef long long ll; int a[100050]; int n, m, t; ll sum, k; bool cal(ll x) { sum = 0; k = m; for(int i = 1; i <= t; i++) { sum += a[i]; while (sum + i >= x) { sum -= x - i; if (--k < 0) return false; } } return k == 0 ? sum <= 0 : true; } int main() { scanf("%d %d", &n, &m); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); sum += a[i]; if(a[i]) t = i; } ll l = t + 1, r = sum + t; while (l <= r) { ll mid = (l + r) / 2; if (cal(mid)) r = mid - 1; else l = mid + 1; } printf("%lld\n", l); }
第四题:
题目:
测试用例:
代码:
#include <cstdio> #include <algorithm> using namespace std; typedef long long ll; const int N = 100005; int n, h[N], st[N], top, l[N], r[N]; ll sum[N]; int main() { while (~scanf("%d", &n)) { top = 0; for(int i = 0; i < n; ++i) { scanf("%d", h + i); sum[i + 1] = sum[i] + h[i]; while(top > 0 && h[st[top - 1]] >= h[i]) --top; l[i] = top == 0 ? 0 : st[top - 1] + 1; st[top++] = i; } top = 0; for(int i = n - 1; i >= 0; --i) { while(top > 0 && h[st[top - 1]] >= h[i]) --top; r[i] = top == 0 ? n : st[top - 1]; st[top++] = i; } long long ans = 0; for(int i = 0; i < n; ++i) ans = max(ans, (long long)h[i] * (sum[r[i]] - sum[l[i]])); printf("%lld\n", ans); } return 0; }
第五题:
题目:
测试用例:
代码:
#include <cstdio> #include <iostream> using namespace std; typedef long long ll; const int N = 100000; ll dp[N+5][2]; ll sum[N+5]; const int mod = 1e9 + 7; void init(int k) { dp[0][0] = 1; for (int i = 1; i <= N; i++) { dp[i][0] = (dp[i-1][0] + dp[i-1][1]) % mod; for (int j = k; j <= i; j += k) dp[i][1] = (dp[i][1] + dp[i-j][0]) % mod; sum[i] = (sum[i-1] + dp[i][0] + dp[i][1]) % mod; } } int main() { int k, n; scanf("%d %d", &n, &k); init(k); while (n--) { int a, b; scanf("%d %d", &a, &b); printf("%lld\n", (sum[b] - sum[a - 1] + mod) % mod); } return 0; }