Java(自閉症)コードのWisdom Cupレビューの2番目のセッション

诶,过去一天了,昨天真的让我知道了不能小看任何一道题(差点就爆零了!!)。
这里来复盘一下自己比赛的时候出现的错误

 (谁说传智杯简单的,我过去就是一脚

ソフトウェアエンジニアリングインターンシップ:

タイトルの説明:
大学での「ソフトウェアエンジニアリング」の必須コースは、理論部分と実践部分に分かれています。理論的な部分は学校の教授によって教えられ、実際的な部分はサードパーティの会社が主導します。学生はHTML、CSS、JavaScript、Vue、Python、djangoなどのテクノロジーを5週間で学び、チームを組んで実際のコースを完了する必要がありますインターネットビジネスアプリケーション。
このコースにはn人(0≤n≤1000)の学生が参加し、26チーム以下に分割されています。各チームはA〜Zで表されます。各チームはプロジェクトを完了し、チーム単位ですべてのチーム(自分のチームを含む)にスコアを付けます。範囲は0〜100の整数です。
このコースで発生する多くの問題(たとえば、作業量が多すぎる、時間がかかりすぎる、不当な評価方法など)に対する学生の不満を静めるために、教師は「見た目」の公正な方法を使用して各チームを決定することにしましたプロジェクトのスコア:
チームの場合、最初にこのチームをスコアリングするすべてのチーム(自分を含む)の平均を計算し、次にこの平均と15ポイント以上異なるスコアを削除します(すべてのスコアが削除されないようにします)状況)、最後に残りのスコアを平均し、切り上げて丸めて、チームのプロジェクトスコアとして使用します。
各生徒について、チームコードと理論上のスコア(0〜100ポイントの整数)を学習しました。学生の最終スコアは、理論スコアの60%にチームのプロジェクトスコアの40%を加えた後、最も近い整数に丸めます。
今教師はすべての生徒のランキングを知りたがっています。同級生とそのチームの得点を高得点から低得点の順に出力してください。
入力フォーマット:
ここに画像の説明を挿入

出力形式:
解答を示すn行を出力します。スコアの高い生徒が優先して出力されますスコアが同じ場合、チーム番号の小さい生徒が優先的に出力されます各行について、最初にクラスメートの成績を出力し、次にチーム番号を表す大文字を出力します。

間違いを犯しやすいです:
(1)最初にこの質問を得ました。長い質問は私をとても怒らせます。これは、この正式なコンテストに初めて参加したからでもあります。ええと、少し緊張しています。それでも、最初にトピックを注意深く読んでください。
我々は平均を取り除くとき(2)最初のエラーが発生しやすいポイントは、我々はする必要が丸いことを見て、私たちは各学生のパフォーマンスを計算するときに、我々はまだする必要が丸いことを見て!
(3)2番目のエラーが発生しやすい点、私は誰もがそれを見たと思います、私はそれを上にマークしました。スコアが同じである場合、小さい番号のチーム番号が優先されます!(ここで私は無限にWAでプレーしているので、目が見えなくなります)
(4)3番目のエラーポイントは、各チームが得点するときに、各ラインがこのチームの得点であるとは言っていないことです。彼は、各ラインが各チームが他のチームに与えるスコアであることを意味します!
例:
70 90 100
95 88 85
30 47 100
Aのスコアは次のとおりです:70 95 30
Bのスコアは次の
ようになります:90 88 47 など、Aのスコアは70 90 100です。(害を及ぼす-長い思い出を与えてください、この質問は多くのワシントン州に送られました、そして最後に考え方は爆発しました、ゲームは想像できます)
最後に、コードが投稿されました:

package 传智杯第二届;
import java.util.*;
public class Test1 {
	static int n,k;
	static int a[][] = new int[30][30]; // 每个队伍互相打的分数
	static double avg[] = new double[30]; // 每个队伍平均分
	static double sum[] = new double[30]; // 每个队伍分数总和
	static int cnt[] = new int[30]; // 每个队伍现在有效得分次数
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		k = sc.nextInt();
		student stu[] = new student[n];
		for(int i = 0;i < n;i++){
			stu[i] = new student();
			stu[i].t = sc.nextInt();
			stu[i].no = sc.next().charAt(0);
		}
		for(int i = 0;i < k;i++){
			for(int j = 0;j < k;j++){
				a[j][i] = sc.nextInt();
				sum[j] += a[j][i]; // 每个队伍的成绩和
			}
		}
		for(int i = 0;i < k;i++)
			avg[i] = sum[i]/(double)k;
		Arrays.fill(cnt,k);
		for(int i = 0;i < k;i++)
			for(int j = 0;j < k;j++){
				if(Math.abs(avg[i]-(double)a[i][j]) > 15){
					sum[i] -= a[i][j];
					cnt[i]--;
				}
			}
		for(int i = 0;i < k;i++)
			avg[i] = (int)(sum[i]/(double)cnt[i]+0.5);
		for(int i = 0;i < n;i++)
			stu[i].t = (int)(stu[i].t*0.6+avg[stu[i].no-'A']*0.4+0.5);
		Arrays.sort(stu);
		for(int i = 0;i < n;i++)
			System.out.println(stu[i].t+" "+stu[i].no);
		sc.close();
	}
}
class student implements Comparable{
	int t;
	char no;
	public int compareTo(Object b){
		student a = (student)b;
		if(this.t < a.t)
			return 1;
		else if(this.t == a.t){
			if(this.no > a.no)
				return 1;
			else
				return -1;
		}
		else return -1;
	}
}

プログラマーの日

トピックの説明:
ここに画像の説明を挿入
入力形式:
ここに画像の説明を挿入
出力形式:
出力回答、つまり、少なくともいくつのオレンジを準備する必要があるか。

間違った考え方:
この質問に対する私の考えは、最低の成績の生徒を見つけ、それを基準として両側に別々に広がることですが、これは完全に間違っていることはわかりません。
もちろん、
サンプルに問題はありません。例:
5
3 4 5 4 3
出力9 // 1 2 3 2 1何も問題はありません。アイデア
が6 1 9 7 6の
場合、オレンジの数は2 1 2です。 1 0が
実際に登場!

正しい考えは次のとおりです:
(1)全員が少なくとも1つのオレンジを受け取る必要があるため、全員が最初にオレンジを送信すると仮定しましょう
(2)左から右にスキャンし、右側のスコアが左側のものより大きい場合は、これを言わないでください人のオレンジの数は左側の+1である必要があります。この場合、負の数になる可能性があるため、右が左よりも小さいと判断しないでください。
(3)最後に、右から左にスキャンします。左側が右側より大きい場合、a [i-1] = max(a [i-1]、a [i] +1)は等しくなります:
a [i-1] = max(a [i-1]、a [i])かなり理解できると思います

コード:

package 传智杯第二届;
import java.io.*;
public class Test2 {
	static int n;
	static int a[] = new int[1000010];
	static int num[] = new int[1000010];
	public static void main(String[] args) throws IOException{
		StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
		re.nextToken(); n = (int)re.nval;
		long ans = 0;
		for(int i = 1; i <= n;i++){
			re.nextToken();
			a[i] = (int)re.nval;
		}
		for(int i = 1;i < n;i++){
			if(a[i] < a[i+1])
				num[i+1] = num[i]+1;
			else if(a[i] == a[i+1])
				num[i+1] = num[i];
		}
		for(int i = n;i > 1;i--){
			if(a[i] < a[i-1])
				num[i-1] = Math.max(num[i-1],num[i]+1);
			else if(a[i] == a[i-1])
				num[i-1] = Math.max(num[i-1],num[i]);
		}
		for(int i = 1;i <= n;i++)
			ans += num[i];
		pr.println(ans+n);
		pr.flush();
	}
}

モードの発生回数

タイトルの説明:
ここに画像の説明を挿入
入力形式:
ここに画像の説明を挿入
出力形式:
ここに画像の説明を挿入
まず、この質問は、この一連の質問の中で最も落とし穴になりそうだと思います。質問の意味は単純で明確ですが、この質問では引き続きMapの使用を調べます。一部のビッグウィッグがマップを使用しなかったと聞きましたが、それは私にとって有害で​​す。この種のローストチキンは、次のような
問題しか分析できません。
(1)まず、このクラスには1e6のクラスメートがあり、各クラスメートに2つの数字がある場合、これらをこの配列に保存し、ここに書き込んでください。マップを使用できない理由を知っています。私は愚かです、2 * 1e6配列を開いて並べ替え、記録します。
(2)そのときにソートしたとき、バケットの行を考えていたので、1e9の数字を見て、ソートが機能しないと思いました(ええと、dbqwtcl)。
(3)しかし、この質問にはまだマップを使用できます!各数値と各数値の発生数をキーと値のペアの形式で保存できます。必要な答えは、最大の値を持つ数値に対応するキーです。

コード:

package 传智杯第二届;
import java.io.*;
import java.util.*;
import java.util.Map.Entry;
public class Test3 {
	static int n;
	static int a[] = new int[1000010];
	static int b[] = new int[1000010];
	static HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
	public static void main(String[] args) throws IOException{
		StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
		re.nextToken(); n = (int)re.nval;
		for(int i = 1;i <= n;i++){
			re.nextToken();
			a[i]  = (int)re.nval;
			re.nextToken();
			b[i] = (int)re.nval;
			b[i] = a[i]^b[i];
			map.put(a[i],0);
			map.put(b[i],0);
		}
		for(int i = 1;i <= n;i++){
			if(a[i] != b[i]){
				map.put(a[i],map.get(a[i])+1);
				map.put(b[i],map.get(b[i])+1);
			}
			else
				map.put(a[i],map.get(a[i])+1);
		}
		int k = 0;
		long ans = 0;
		for(Entry<Integer,Integer> entry : map.entrySet()){ // 这里可能比较关键 使用Entry可以很好很快速的返回每一个键值对的键与值
			if(entry.getValue() > ans){
				ans = entry.getValue();
				k = entry.getKey();
			}
			else if(entry.getValue() == ans && entry.getKey() < k)
				k = entry.getKey();
		}
		pr.println(k);
		pr.flush();
	}
}

高速読み取りと高速出力がわからない場合は、このブログを参照しください。4
番目の質問はまだ書かれていません。

元の記事を32件公開 賞賛5件 訪問862件

おすすめ

転載: blog.csdn.net/shizhuba/article/details/105465194