1時間、2つのコードの質問。
1 、投票
投票に参加している小動物はn匹(数1〜n)います。再びn番号が与えられると、それは各小動物崇拝状況を表します。i番目の数字は、i番目の動物の崇拝を表します。0の場合は、動物を崇拝せず、自分自身にのみ投票できることを意味します。0でない場合はjと見なされ、投票時に自分自身に投票し、jで投票する場合があります。小動物ごとに可能な限り高い票数を見つけてください。
ケース:
4
0 1 2 1 4 の
最初の行は、合計4匹の動物を示します。
2行目、崇拝のない1番の動物、2崇拝1、3崇拝2、4崇拝1
出力:4 2 1 1
分析
- 必要なのは、各動物の最高得票数で、i番目の動物の最高得票数を計算する場合、崇拝対象の有無にかかわらず、間違いなく自分で投票することは間違いありません。
- i番目の動物の投票数を数えるとき、他の動物はできるだけ投票します。最初に、彼らは自分自身に投票することはできません。2番目に、彼らは投票するためにアイドルに従う必要があります。崇拝チェーンがある場合、アイドルアイドルアイドル...そのうちの1人がiの場合、iで投票できます(私は自分で投票します)。これは、他の動物がi番目の動物に投票する場合です。
- この崇拝チェーンが動物iに到達しない場合、つまり常にアイドルを探している場合、終了は0です。これは、一部の動物がiに投票できないことを意味します。
コード(java)
public static void ali1(){
// 4
// 0 1 2 1
Scanner in = new Scanner(System.in);
//动物个数
int n = in.nextInt();
int admire [] = new int[n+1];
for (int i = 1; i < admire.length; i++) {
admire[i] = in.nextInt();
}
//记录每个动物的最高分数 0 ~ n。下标0 舍弃 1~n 动物的最高分
int maxScore [] = new int[n+1];
//计算第i动物的最高分 尽可能让这个号的动物多票数
for (int i = 1; i <= n; i++) {
//第j号动物 尽量投i
for(int j = 1;j <= n;j++){
if(j == i){
//自己不管咋样 都要投自己 才可能最高
maxScore[i]++;
}else{
//j != i 时 想让j给i投票
//j号 看崇拜那个?
//j的明星
int fans = j;
int star = admire[fans];
while(star != 0){
if(star == i){
maxScore[i]++;
break;
}
fans = star;
star = admire[fans];
}
}
}
}
for (int i = 1; i < maxScore.length; i++) {
System.out.println(maxScore[i]);
}
}