水平有限,只能解出前两题
第一题
无人机施肥,农田共有n行,无人机携带了m千克肥料。无人机的施肥方式为:
给第一行施肥1kg;
给第二行施肥1kg;
…
给第n - 1行施肥1kg;
给第n 行施肥1kg;
然后更改方向给第 n - 1 行施肥1kg;
给第 n - 2 行施肥1kg;
即每次给整个农田施一遍肥料,就会自动更改方向继续施肥,直到无人机携带的肥料用完为止。
现在想知道每行最终施了多少肥料。
输入:农田行数n 和 肥料数m。
输出:每行施肥的数量,为一个数组。
例:
输入:4 6
输出:1 2 2 1
思路
模拟,注意题意表示一次施肥到最后一行然后返回,把(2 * n - 2)当作一次来回,第二次再从头开始施肥。则num = m / (2 * n - 2)
表示来回的次数。
还需要判断剩余肥料的位置,可能从第一行没走到最后就没有肥料了,还有可能到最后一行再返回。
代码
public class Main08132 {
static int[] res;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
res = helper(n, m);
for (int i : res)
System.out.print(i + " ");
}
public static int[] helper(int n ,int m){
int num = m / (2 * n - 2);
int l = m % (2 * n - 2);
res = new int[n];
for(int i = 0; i < n; i++){
res[i] = num;
}
for(int i = 1; i < n - 1; i++){
res[i] += num;
}
if(l == 0) return res;
else if(l <= n - 1){
for (int i = 0; i < l; i++){
res[i] += 1;
}
}else{
long q = l - n;
for (int i = 0; i < n; i++){
res[i] += 1;
}
for (int i = n - 2; i > n - 2 - q; i--){
res[i] += 1;
}
}
return res;
}
}
第二题
单词包括大小写,按出现次数排序,若次数相同按字典序排序
import java.util.*;
public class Main0813 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
List<String> list = new ArrayList<>();
for(int i = 0; i < n; i++) {
list.add(sc.next());
sc.nextLine();
}
Map<String, Integer> map = new HashMap<>();
for(String s : list){
String str = s.toLowerCase(Locale.ROOT);
map.put(str, map.getOrDefault(str, 0 ) + 1);
}
PriorityQueue<Map.Entry<String, Integer>> queue = new PriorityQueue<>(new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
if(o1.getValue() == o2.getValue())
return o1.getKey().compareTo(o2.getKey());
else return o2.getValue() - o1.getValue();
}
});
for(Map.Entry<String, Integer> entry : map.entrySet()){
queue.add(entry);
}
Map.Entry<String, Integer> en = queue.peek();
System.out.println(en.getKey() + " " + en.getValue());
}
}