网易互娱在线编程纪要
第一题
public class Main {
private static class Team implements Comparable <Team >{
String name;
int score, pureGoal, totalGoals;
public Team (String name) {
this .name = name;
}
@Override
public int compareTo (Team t) {
return -(score != t.score ? score - t.score : pureGoal != t.pureGoal ? pureGoal - t.pureGoal :
totalGoals != t.totalGoals ? totalGoals - t.totalGoals : -name.compareTo(t.name));
}
@Override
public String toString () {
return name;
}
}
public static void main (String[] args) throws IOException {
Read.init(System.in);
String t1, t2;
Map<String, Team> map = new HashMap<>();
for (int k=0 ; k<4 ; k++) {
map.clear();
for (int i=0 ; i<6 ; i++) {
t1 = Read.next();
String temp = Read.next();
t2 = Read.next();
int v1 = temp.charAt(0 ) - '0' , v2 = temp.charAt(2 ) - '0' ;
int s1, s2;
if (v1 > v2) {
s1 = 3 ;
s2 = 0 ;
} else if (v1 < v2) {
s1 = 0 ;
s2 = 3 ;
} else {
s1 = s2 = 1 ;
}
if (!map.containsKey(t1)) {
Team t = new Team(t1);
t.score = s1;
t.pureGoal = v1 - v2;
t.totalGoals = v1;
map.put(t1, t);
} else {
map.get(t1).score += s1;
map.get(t1).pureGoal += (v1 - v2);
map.get(t1).totalGoals += v1;
}
if (!map.containsKey(t2)) {
Team t = new Team(t2);
t.score = s2;
t.pureGoal = v2 - v1;
t.totalGoals = v2;
map.put(t2, t);
} else {
map.get(t2).score += s2;
map.get(t2).pureGoal += (v2 - v1);
map.get(t2).totalGoals += v2;
}
}
List<Team> list = new ArrayList<>(map.values());
Collections.sort(list);
for (int i=0 ; i<4 ; i++) {
if (i == 0 ) System.out.print(list.get(i));
else System.out.print(" " + list.get(i));
}
System.out.println();
}
}
}
第二题
public class Main {
public static void main (String[] args) throws IOException {
Read.init(System.in);
int M = Read.nextInt(), N = Read.nextInt();
int [][] num = new int [M][N];
for (int i=0 ; i<M; i++) {
for (int j=0 ; j<N; j++) {
String temp = Read.next();
if (temp.length() == 4 && temp.charAt(1 ) == 'i' ) {
if (temp.charAt(0 ) == '+' )
num[i][j] = 111 ;
else
num[i][j] = -111 ;
} else num[i][j] = Integer.parseInt(temp);
}
}
int q = Read.nextInt();
int x1, x2, y1, y2;
for (int i=0 ; i<q; i++) {
x1 = Read.nextInt() - 1 ;
y1 = Read.nextInt() - 1 ;
x2 = Read.nextInt() - 1 ;
y2 = Read.nextInt() - 1 ;
System.out.println(help(num, x1, x2, y1, y2));
}
}
private static String help (int [][] num, int x1, int x2, int y1, int y2) {
int sum = 0 ;
boolean pinf = false , ninf = false ;
for (int i=x1; i<=x2; i++) {
for (int j=y1; j<=y2; j++) {
if (num[i][j] == 111 ) pinf = true ;
else if (num[i][j] == -111 ) ninf = true ;
else sum += num[i][j];
if (pinf && ninf) return "NaN" ;
}
}
if (pinf) return "+inf" ;
else if (ninf) return "-inf" ;
else return "" + sum;
}
}
第三题(未完成)
public class Main {
private static class Room {
boolean isFull = false ;
int [] val = new int [6 ];
int empty = 6 ;
}
static int t1, t2, t3;
public static void main (String[] args) throws IOException {
Read.init(System.in);
int N = Read.nextInt();
t1 = Read.nextInt();
t2 = Read.nextInt();
t3 = Read.nextInt();
List<Room> lr = new ArrayList<>();
int [] add = new int [N];
for (int i=0 ; i<N; i++) {
add[i] = Read.nextInt();
int k = Read.nextInt();
List<Integer> list = new ArrayList<>();
for (int j=0 ; j<k; j++) {
list.add(Read.nextInt());
}
if (lr.size() == 0 || needNew(lr, list)) {
Room r = new Room();
r.empty = 6 - list.size();
for (int j=0 ; j<list.size(); j++)
r.val[i] = list.get(i);
if (r.empty == 0 ) r.isFull = true ;
lr.add(r);
} else {
int pre = -1 ;
boolean first = true ;
for (int j=0 ; j<lr.size(); j++) {
if (lr.get(j).isFull) continue ;
if (first && lr.get(j).empty >= list.size()) {
first = false ;
pre = j;
int sum = 0 , sum2 = 0 ;
for (int k1=0 ; k1<6 ; k1++) sum += lr.get(j).val[k1];
for (int k1=0 ; k1<list.size(); k1++) {
sum += list.get(k1);
sum2 += list.get(k1);
}
sum /= (6 - lr.get(j).empty + list.size());
sum2 /= list.size();
if (Math.abs(sum - sum2) < t1) {
lr.get(j).empty -= list.size();
for (int k1=6 -lr.get(j).empty; k1<6 -lr.get(j).empty+list.size(); k1++)
lr.get(j).val[k1] = list.get(k1-6 -lr.get(j).empty);
if (lr.get(j).empty == 0 ) lr.get(j).isFull = true ;
}
}
}
lr.get(pre).empty -= list.size();
for (int k1=6 -lr.get(pre).empty; k1<6 -lr.get(pre).empty+list.size(); k1++)
lr.get(pre).val[k1] = list.get(k1-6 -lr.get(pre).empty);
if (lr.get(pre).empty == 0 ) lr.get(pre).isFull = true ;
}
}
}
private static boolean needNew (List<Room> lr, List<Integer> list) {
int i = 0 ;
for (; i<lr.size(); i++) {
if (!lr.get(i).isFull && lr.get(i).empty >= list.size()) break ;
}
if (i == lr.size()) return true ;
return false ;
}
}
统一的读入方式
class Read {
static BufferedReader br;
static StringTokenizer st;
static void init(InputStream in) {
br = new BufferedReader(new InputStreamReader(in));
st = new StringTokenizer("" );
}
public static double nextDouble () throws IOException {
return Double.parseDouble(next());
}
static String next() throws IOException {
while (!st.hasMoreTokens()) {
st = new StringTokenizer(br.readLine());
}
return st.nextToken();
}
static int nextInt() throws IOException {
return Integer.parseInt(next());
}
}
C版本的第二题
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std ;
int M, N;
int a[1005 ][1005 ];
void help(int x1, int x2, int y1, int y2) {
int sum = 0 ;
bool b1 = false , b2 = false ;
for (int i=x1; i<=x2; i++) {
for (int j=y1; j<=y2; j++) {
if (a[i][j] == 111 ) b1 = true ;
else if (a[i][j] == -111 ) b2 = true ;
else sum += a[i][j];
if (b1 && b2) {
printf ("NaN\n" );
return ;
}
}
}
if (b1) printf ("+inf" );
else if (b2) printf ("-inf" );
else printf ("%d" , sum);
printf ("\n" );
}
int main() {
scanf ("%d%d" , &M, &N);
string s;
for (int i=0 ; i<M; i++) {
for (int j=0 ; j<N; j++) {
cin >> s;
if (s.length() == 4 && s[1 ] == 'i' ) {
if (s[0 ] == '+' ) a[i][j] = 111 ;
else a[i][j] = -111 ;
} else a[i][j] = stoi(s);
}
}
int q;
scanf ("%d" , &q);
int x1, y1, x2, y2;
for (int i=0 ; i<q; i++) {
cin >> x1 >> y1 >> x2 >> y2;
help(x1-1 , x2-1 , y1-1 , y2-1 );
}
return 0 ;
}
总结
浪费时间想在时间上AC第二题,于是写了个C版本,但还是没通过,结果浪费了大量时间,导致第三题没写完; 大概也就一周没刷题,感觉思路就没那么便捷了,看来还是自己太菜; 第三道题思路不难,主要是很复杂,得细细捋一遍,等有时间再补上完整代码;