感觉像是找规律题:因为最左的一个LL、最右的一个R永远不会被消去,所以我们需要做的就是最后一个L的位置减去第一个R的位置就是消去的人数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String queue = sc.next();
int lCount = 0, rCount = queue.length() - 1, count = 0;
for (int i = 0; i < queue.length(); i++) {
if (queue.charAt(i) == 'R')//找到第一个R
break;
lCount++;
}
for (int j = queue.length() - 1; j >= 0; j--) {
if (queue.charAt(j) == 'L')//找到最后一个L
break;
rCount--;
}
System.out.println(lCount + " " + rCount);
count = queue.length() - (rCount - lCount);
if (count > queue.length())
count = queue.length();
System.out.println(count);
}
}
或者一行实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String queue = sc.next();
int count = 0;
count = queue.length() - (queue.lastIndexOf("L") - queue.indexOf("R"));
System.out.println(count);
}
}
整体来说,可能大家思路都比较清晰,麻烦的就是输入,然后对输入的拆分处理是关键。
尤其注意最终排名的要求:首先按积分,积分相同按净胜球,再相同按进球数。所以在写排序函数的时候需要注意。
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeMap;
public class laoxu {
class Team {
String name;
int grade;
int realwin;
int in;
public Team(String name, int grade, int realwin, int in) {
this.name = name;
this.grade = grade;
this.realwin = realwin;
this.in = in;
}
public void setGrade(int grade) {
this.grade = grade;
}
public void setRealwin(int realwin) {
this.realwin = realwin;
}
public void setIn(int in) {
this.in = in;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
laoxu main = new laoxu();
while (sc.hasNext()) {
String ns = sc.nextLine();
int n = Integer.valueOf(ns);
Team[] win = new Team[n];// n支球队的名字
TreeMap<String, Team> map = new TreeMap<>();
for (int i = 0; i < n; i++) {
String cname = sc.nextLine();
Team team = main.new Team(cname, 0, 0, 0);
map.put(cname, team);
}
int len = (n * (n - 1)) / 2;// 对所有的比赛结果进行处理
for (int i = 0; i < len; i++) {
// 以空格分为对战球队str[0]和比分str[1]分别进行处理
// A-B 1:2
String[] str = sc.nextLine().split(" ");
String[] name = str[0].split("-");
String cname1 = name[0];// A
String cname2 = name[1];// B
String[] grad = str[1].split(":");
int c1 = Integer.valueOf(grad[0]);// 1
int c2 = Integer.valueOf(grad[1]);// 2
int c = c1 - c2;// 比分差距,用于计算净胜球
int grade1 = 0;// 得分 3 1 0
int realwin1 = 0;// 净胜球数
int in1 = c1;// 进球数
int grade2 = 0;
int realwin2 = 0;
int in2 = c2;
if (c == 0) {// 平局
grade1 = 1;
grade2 = 1;
}
if (c > 0) {
grade1 = 3;
realwin1 = c;
}
if (c < 0) {
grade2 = 3;
realwin2 = c2 - c1;
}
//设置得分、净胜球数、进球数
Team team = map.get(cname1);
team.setGrade(team.grade + grade1);
team.setIn(team.in + in1);
team.setRealwin(team.realwin + realwin1);
map.put(cname1, team);
Team team2 = map.get(cname2);
team2.setGrade(team2.grade + grade2);
team2.setIn(team2.in + in2);
team2.setRealwin(team2.realwin + realwin2);
map.put(cname2, team2);
}
int i = 0;
for (String key : map.keySet()) {
win[i++] = map.get(key);
}
//自定义排序比较器。排序规则:
//首先按照积分,其次净胜球,最后进球数
Arrays.sort(win, new Comparator<Team>() {
public int compare(Team o1, Team o2) {
int grade = o2.grade - o1.grade;
int realwin = o2.realwin - o1.realwin;
int in = o2.in - o1.in;
if (grade != 0)
return grade;
else if (realwin != 0)
return realwin;
else
return in;
}
});
String[] name = new String[n / 2];
for (i = 0; i < n / 2; i++)
name[i] = win[i].name;
Arrays.sort(name);//对球队名字按字典序输出
for (i = 0; i < n / 2; i++)
System.out.println(name[i]);
}
}
}
很简单,利用map的键值对特性,键存储时间信息,值存储对应时间的课程信息;因为考虑到同一时间可能有多门课程(即冲突)的情况,所以值用ArrayList来存储。
处理完后,遍历map,找出相应时间的list的大小(也就是同一时间有几门课),如果大于1,说明有冲突;如果都没有,则输出“YES”。
但要注意题目要求按时间顺序输出,所以就需要使用TreeMap了。
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String, List<String>> map = new TreeMap<String, List<String>>();
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
String time = sc.next(), code = sc.next();
if (!map.containsKey(time))
map.put(time, new ArrayList<String>());
map.get(time).add(code);
}
for (String time : map.keySet()) {
if (map.get(time).size() > 1) {
System.out.printf(time);
for (String code : map.get(time))
System.out.printf(" " + code);
System.out.printf("\n");
}
}
}
}
------至所有正在努力奋斗的程序猿们!加油!!
有码走遍天下 无码寸步难行
1024 - 梦想,永不止步!
爱编程 不爱Bug
爱加班 不爱黑眼圈
固执 但不偏执
疯狂 但不疯癫
生活里的菜鸟
工作中的大神
身怀宝藏,一心憧憬星辰大海
追求极致,目标始于高山之巅
一群怀揣好奇,梦想改变世界的孩子
一群追日逐浪,正在改变世界的极客
你们用最美的语言,诠释着科技的力量
你们用极速的创新,引领着时代的变迁
——乐于分享,共同进步,欢迎补充
——Any comments greatly appreciated
——诚心欢迎各位交流讨论!QQ:1138517609
——CSDN:https://blog.csdn.net/u011489043
——简书:https://www.jianshu.com/u/4968682d58d1
——GitHub:https://github.com/selfconzrr