9.17 滴滴笔试
1、dfs(80%)
没找出问题在哪
小昱做了很久的实验得到了一个用正整数表示的实验数据,并记录在了纸上。但是由于做完实验太过激动,他一不小心把墨水打翻溅在了纸上,导致数据中一些位置上的数字看不清楚。他仍记得这个数据有以下三个特征:
这个数是正整数,且没有前导零(即数的最高位不是0)
这个数任意两个相邻数位的数字不同
这个数可以被3整除
他现在很关心在满足以上特征的条件下,这个数字最小为多少。
输入:
?12?0?9??
输出:
212101902
import java.util.Scanner;
public class Main {
static String num;
static final int base = 3;
static char[] ans;
static int n;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
num = scanner.next();
n = num.length();
ans = new char[n];
dfs(0, 0, '#');
System.out.println(new String(ans));
}
static boolean dfs(int start, int remain, char front) {
if (start == n) {
return remain == 0;
}
char ch = num.charAt(start);
remain *= 10;
if (ch != '?') {
ans[start] = ch;
return dfs(start + 1, (ch - '0' + remain) % base, ch);
} else {
for (char c = '0'; c <= '9'; ++c) {
if (start == 0 && c == '0') {
continue;
}
char back = start < n - 1 ? num.charAt(start + 1) : '#';
if (c != front && c != back) {
ans[start] = c;
if (dfs(start + 1, (c - '0' + remain) % base, c)) {
return true;
}
}
}
}
return false;
}
}2、差分数组(0%)
一直在写线段树,没写出来。结果可以用差分,下来写了一下,不知道对不对
小明正在刷栅栏。为了使得栅栏在经过风吹雨打后依然不掉色,需要用两种不同的油漆刷栅栏。
栅栏被按顺序编号为1到1000000000。每一段栅栏需要至少刷 p 遍的1号油漆和 q 遍的2号油漆后才能保证长时间不掉色。
每次刷漆都会使用某种类型的油漆,并将编号属于某个区间内的栅栏都刷上这种油漆。
现在给出每次刷漆的栅栏编号范围和油漆种类,请你求出有多少段栅栏能够长时间不掉色。 * 输入描述
第一行有三个正整数n,p,q(1<=n<=100000,1<=p,q<=n),代表刷漆的次数,以及两个参数 p 和 q。
第二到四行给出了一个大小为3*n的矩阵,第 i 列的三个数从上到下记为l,r,t(1<=l,r<=1000000000,1<=t<=2), * 代表第i次刷漆将编号在 l 到 r 之间的栅栏刷了一遍 t号油漆。
测试用例:
输入:
5 2 2
1 1 2 3 2
3 5 4 5 4
1 2 1 1 2
输出:
3
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main3 {
static final int N = (int) 1e10;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int p = scanner.nextInt();
int q = scanner.nextInt();
int[] l = new int[n];
int[] r = new int[n];
int[] type = new int[n];
// N很大,采用离散化
Map<Integer, Integer> ones = new HashMap<>();
Map<Integer, Integer> twos = new HashMap<>();
getInput(l, scanner);
getInput(r, scanner);
getInput(type, scanner);
for (int i = 0; i < n; i++) {
if (type[i] == 1) {
ones.put(l[i], ones.getOrDefault(l[i], 0) + 1);
ones.put(r[i] + 1, ones.getOrDefault(r[i] + 1, 0) - 1);
} else {
twos.put(l[i], ones.getOrDefault(l[i], 0) + 1);
twos.put(r[i] + 1, ones.getOrDefault(r[i] + 1, 0) - 1);
}
}
int ans = 0;
int oneSum = 0, twoSum = 0;
for (int i = 1; ; i++) {
oneSum += ones.getOrDefault(i, 0);
twoSum += twos.getOrDefault(i, 0);
if (oneSum >= p && twoSum >= q) {
ans++;
}
if (i == N) {
break;
}
}
System.out.println(ans);
}
static void getInput(int[] nums, Scanner scanner) {
for (int i = 0; i < nums.length; i++) {
nums[i] = scanner.nextInt();
}
}
}#滴滴##滴滴笔试##滴滴校招#
