React: Material UI でヘッダーの右端にアイコンを表示する。

・参考:
ReactのMaterial-UIで、右揃えの要素を作るには | Kanchiの雑記帳
【初心者】#1 Reactの基礎とMaterial-UI使って綺麗に作ってみる #JavaScript - Qiita

・説明:

 <div style={{ flexGrow: 1 }}></div>

を使えば良い。具体的には下のコードのHeader.jsxを参照。

import React from "react";
import AppBar from "@mui/material/AppBar";
import Toolbar from "@mui/material/Toolbar";
import Typography from "@mui/material/Typography";
import AccountCircleIcon from "@mui/icons-material/AccountCircle";

const Header = () => {
  return (
    /* ヘッダーを上に固定*/
    <AppBar position="static">
      {/*Toolbarが青い線*/}
      <Toolbar>
        <Typography>ヘッダー</Typography>
        {/*右寄せ*/}
        <div style={{ flexGrow: 1 }}></div>
        <Typography>
          <AccountCircleIcon />
        </Typography>
      </Toolbar>
    </AppBar>
  );
};
export default Header;

atcoder ABC 325 C - SensorsのPythonでの説明

atcoder.jp

・説明
 C - Cross
 の類題をもとにして解ける。この問題は隣接した'#'の数を求める問題なのでこの問題のDFSを今考えている問題のマス全てで行い、隣接する'#'の数をansにappendする。答えはlen(ans)になる。

import sys
sys.setrecursionlimit(10**6)

H,W=map(int,input().split())
map=[list(input()) for _ in range(H)]

#隣接した'#'の数を求めるDFS。
#例えばcnt += dfs(y2, x2)はy3, x3 = y2 + dy, x2 + dx,,,,とするとy3,x3までdfsじた場合、つまり#が3個のときはcnt=cnt+dfs(y2,x2) = cnt+cnt+dfs(y3,x3) = cnt+cnt+1 (return 1より) = 3となる(cnt=1より)。
def dfs(x, y):
    cnt=1
    if map[x][y] == "#":
        map[x][y] = "."
        
    for dx in range(-1,2):  
      for dy in range(-1,2): 
        nx = x + dx
        ny = y + dy
        if 0 <= nx < H and 0 <= ny < W and map[nx][ny] == "#":
            cnt+=dfs(nx,ny)
    return cnt

#ansに'#'の個数を入れていく。答えがlen(ans)になる。
ans=[]
for i in range(H):
    for j in range(W):
        if map[i][j]=='.':
            continue
        ans.append(dfs(i,j))
print(len(ans))

atcoder ABC 323 C - World Tour Finalsの説明

atcoder.jp


・説明
 'o'の問題は再び使えないので、累積和とbisectだと無理。xのものを抽出して、それをmaxのものと引き算してマイナスになるまでやる。

・失敗例

def II(): return int(input())
def MI(): return map(int, input().split())
def LI(): return list(map(int, input().split()))
def LS(): return list(map(str, input().split()))

n,m=MI()
a=LI()
s=[input() for _ in range(n)]

import bisect

cnt=[i+1 for i in range(n)]
#print(s)
for i in range(n):
    for j in range(m):
        if s[i][j]=='o':
            cnt[i]+=a[j]

a.sort(reverse=True)
ruiseki=[0]
for i in range(m):
    tmp=a[i]+ruiseki[i]
    ruiseki.append(tmp)

ma=max(cnt)
for i in range(n):
    if cnt[i]==ma:
        print(0)
        continue
    sa=abs(cnt[i]-ma)
    bir=bisect.bisect_right(ruiseki,sa)
    print(bir)


・AC例

def II(): return int(input())
def MI(): return map(int, input().split())
def LI(): return list(map(int, input().split()))
def LS(): return list(map(str, input().split()))

n,m=MI()
a=LI()
s=[input() for _ in range(n)]

cnt=[i+1 for i in range(n)]  #点数
flag=[[] for _ in range(n)]  #xのものを入れる

#'x'のものを抽出する。
for i in range(n):
    for j in range(m):
        if s[i][j]=='o':
            cnt[i]+=a[j]
        if s[i][j]=='x':
            flag[i].append(a[j])


ma=max(cnt)
for i in range(n):
    if cnt[i]==ma:
        print(0)
        continue

    sa=abs(cnt[i]-ma)  #これがマイナスになるまで'x'のものを引き算する。
    flag[i].sort(reverse=True)

    ans=0
    for f in flag[i]:
        if sa<0:
            break
        sa-=f
        ans+=1
    print(ans)

Python 安定ソート atcoder ABC323 B - Round-Robin Tournament

・参考
docs.python.org

・説明
 2次元のリストにおいて、普通のソートと安定ソートを使った場合で比べる。降順のときは変わらないが昇順のときは2列目の値が小さいのから先に並び替える。

・例

ans=[[3, 0], [1, 1], [4, 2], [5, 3], [3, 4], [0, 5], [5, 6]]

#普通のソート。
ans.sort()  #[[0, 5], [1, 1], [3, 0], [3, 4], [4, 2], [5, 3], [5, 6]]
ans.sort(reverse=True)   #[[5, 6], [5, 3], [4, 2], [3, 4], [3, 0], [1, 1], [0, 5]]


#安定ソート。
from operator import itemgetter
ans=sorted(ans, key=itemgetter(0), reverse=True)  #ansの0列に対して大きい順に並べて、同じ時ansの1列を見て小さい方を先に並び替える。
#[[5, 3], [5, 6], [4, 2], [3, 0], [3, 4], [1, 1], [0, 5]]

ans=sorted(ans, key=itemgetter(0))  #ansの0列に対して小さい順に並べて、同じ時ansの1列を見て大きい方を先に並び替える。
#[[0, 5], [1, 1], [3, 0], [3, 4], [4, 2], [5, 3], [5, 6]]

・例題
atcoder.jp

・例題の実装例

n=int(input())
from operator import itemgetter
cnt_idx=[i for i in range(n)]
cnt=[0]*n

for i in range(n):
    ox=input()   
    for j in range(n):
        if ox[j]=='o':
            cnt[i]+=1
            
ans=[]
for i in range(n):
    ans.append([cnt[i], cnt_idx[i]])
    
ans=sorted(ans, key=itemgetter(0), reverse=True)  

for i in range(n):
    print(ans[i][1]+1, end=" ")

Java Enumの勉強。values()とか。

・説明
 JavaEnumについて具体的にプログラムを動かしながら勉強した。プログラムの説明は定数がApple, Orang, Grapeとあり、この色と数字をgetColor, getNumberで取得できることを確認する。またvalue()を使うと定数が取ってこれることも確認した。

・実装

//Fruits.java

public enum Fruits{
  Apple("赤",0),
  Orange("橙",1),
  Grape("青",2);

  private final String color;  //色。Appleだと赤。
  private final int number;   //内部変数。Appleだと0。

  private Fruits(String color,int number){
    this.color=color;
    this.number=number;
  }
  //フィールドのcolorを返す.
  public String getColor(){
    return this.color;
  }
  public int getNumber(){
    return this.number;
  }
}
//メイン
//testMain.java

public class testMain {
  public static void main(String[] args) {
    for (int i=0;i<3;++i){
      System.out.println(Fruits.values()[i]);  //values()[0]はApple, values()[1]はOrange,,,となる。     
    }
    //Apple
    System.out.println(Fruits.Apple.getColor());  //.Apple.getColorでAppleの色、つまり赤をとってくる。
    System.out.println(Fruits.Apple.getNumber());  //Appleのnumberの0をとってくる。
    
    //Orange
    System.out.println(Fruits.Orange.getColor());  
    System.out.println(Fruits.Orange.getNumber());

    //Grape
    System.out.println(Fruits.Grape.getColor());  
    System.out.println(Fruits.Grape.getNumber());
  }
}
//出力

//Apple
//Orange
//Grape

//赤
//0

//橙
//1

//青
//2

atcoder ABC 321 C - 321-like Searcherの説明

atcoder.jp

・説明
 "9876543210"が最大の答えになるのでこれ以下の値を列挙する。今回はitertoolsのcombinationsを使った。

from itertools import combinations
k=int(input())

C=[9,8,7,6,5,4,3,2,1,0]
ans=[]

for i in range(1,11):
    for c in combinations(C,i):
        #例えば{9,8}を98という値にして、ansにappendする。
        tmp=0
        for cc in c:
            tmp=tmp*10+cc
        ans.append(tmp)
 
ans.sort()
print(ans[k])

atcoder ABC320 E - Somen Nagashi のSortedListを使った実装

atcoder.jp

・参考 
トヨタ自動車プログラミングコンテスト2023#5(AtCoder Beginner Contest 320) - YouTube
Sorted List — Sorted Containers 2.4.0 documentation

・説明
 SortedListを使うことで先頭の要素(昇順になっているので最小値)をpop(0)を使い、O(log (N))で取得できる。普通のリストではpopに引数を付けるとO(N)になり、TLEになる。他にもheapqやdequeを使うことで解くことができるがSortedListが楽だと思う。
 プログラムの説明は今、列にいる人をorder、列から外れた人をt_whoで管理して、T以下の時間のものをorderに戻す。詳しい説明はコメントアウトしている。

from sortedcontainers import SortedList

n,m=map(int,input().split())

ans=[0 for _ in range(n)]
order=SortedList([i for i in range(n)])  #列にいる人の順番.
t_who=SortedList()   #(時間,何番目の人)を追加していく、何番目の人がどの時間に列に戻るか表す。

for _ in range(m):
    t,w,s=map(int,input().split())
    
    while len(t_who)!=0:
        tt,who=t_who.pop(0)
        #t_whoからt以下の時間の人を列orderに戻す.
        if tt<=t:
            order.add(who)
        #そうでなかったら、popしたものをもとに戻してbreak.
        else:
            t_who.add((tt,who))
            break
    
    if len(order)==0:
        continue
    p=order.pop(0)   #そうめんを食べる人.
    ans[p]+=w
    t_who.add((t+s,p))

for i in range(n):
    print(ans[i])