AtCoder Card game for Two by Python sorted関数
今日は前回に引き続きCard game for Twoの sorted関数から進めて行きたいと思います!!まだ前回のNoteを読んでいない方は下のURLから是非読んでみて下さい
https://note.com/masa_engneering/n/n82b25c3205c3
その前にこの問題の考え方から説明をして行きたいと思います!!
n = int(input())
ls = list(map(int,input().split()))
alice = 0
bob = 0
b = sorted(ls, reverse=True)
for i in range(n):
if (i%2 ==0):
alice+=b[i]
else:
bob+=b[i]
ans = alice - bob
print (ans)
今回の問題は順に大きい数から引いていくので必然的に一番大きいものはAliceが引き次に大きい物をBobが引きます。
なので、どの数をどちらが引くのかを偶数枚目なのか奇数枚目なのかで表現していきます。
この画像のように順に引いていきます。
一番大きい6をAlice、次に大きい5をBob。
これより、偶数回目をAliceが引き奇数回目をBobが引くことが分かります。
ココで気を付けなければいけないのが、上の画像では順番を揃えて書いているので、そのままの偶数、奇数で分けても良いのですが順番がずれていると、引くものも変わってしまいます。(一番大きい物をAlice が引かなければいけないので)
例えば、5と6を入れ替えると5をAliceが引きことになります。そうすると、問題とのずれが起きてしまうので、並びを降順にしなければなりません。
そこで使うのが"sorted関数"です
では、sorted関数についての説明です!
上記したように"sorted関数"は順番を入れ替えるための関数です。
今回のコードでは5行目で使っています
b = sorted(ls, reverse=True)
一般的な書式は
sorted(ls)
#lsはリスト
一個上のコードでは、リストの中身を昇順に並び替えます。
例
ls = [5,1,6,7,3,4]
b = sorted(ls)
print(ls)
print(b)
# 5,1,6,7,3,4
# 1,3,4,5,6,7
となります!
ただ、今回は降順にしたいのでその場合は"reverse"が"True"とします!
ls = [5,1,6,7,3,4]
b = sorted(ls,reverse=True)
print(ls)
print(b)
# 5,1,6,7,3,4
# 7,6,5,4,3,1
となります!これがちょっとした注意点ですね!!
デフォルトでは昇順になっている!!!!
ここまで読んで頂きありがとうございました!!
コラム
# include <stdio.h>
int main ()
{
int n;
int ls[101];
int alice = 0;
int bob = 0;
int tmp = 0;
scanf("%d",&n);
for (int i=0; i<n; i++){
scanf("%d",&ls[i]);
}
for (int j=0; j<n-1; j++){
for (int k=j+1; k<n; k++){
tmp = ls[j];
if (ls[j] < ls[k]){
ls[j] = ls[k];
ls[k] = tmp;
}
}
}
for (int i=0; i<n; i++){
if (i%2 == 0){
alice+=ls[i];
}
else{
bob+=ls[i];
}
}
printf("%d",alice - bob);
return 0;
}
上のコードは同じ問題をC言語で書いてみたやつです!!
考え方は全く同じで並べ替えをして奇数回目か、偶数回目かでどちらが引いたのかを判断しています!
ただ、Pythonとの違いは並べ替えの方法です!
C言語では、ループを使い前後で比較し並べ替えを行っています!!
Pythonでは、一文で済むんですけどね
最後まで読んで頂きありがとうございました!!
コメントや意見を頂けると嬉しいです!!