【Java】AtCoderのABC-208に参加しました（レート：215→219）。

こんばんは。

2021/7/04に、AtCoderのABC-208に参加しました。
レートは以下の通りとなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/f9d025b6-4b76-b72e-c467-200d4f64c25b.png)

レートは215→219に更新！ってたったの4点だけ？
開始が10分ほど遅れたものの、Cまでノーミスで解いたのですが、結果的に・・
早解きが重要なのかな。順位は5823位/8444でした。周囲のレベルがかなり上がっているようですね。
そしてA、B問題がいつもより難しいような・・？

###A問題

さいころをa回振るとき、出た目の合計がbになる事はあるか？
6通り×A通りの合計があるな、どうあてはめるかな、と思ったのですが
ちょっと考えたら、ほとんどの数値が考えられる事に気付きました。

x回振るので最小はx、最大は6xという事になり、その中であればYes、そうでなければNoとなります。

```java

import java.util.Scanner;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  int a = sc.nextInt();
  int b = sc.nextInt();
  int s1 = 0;
  int s2 = 0;
  if(b>=a&&b<=6*a){
    System.out.println("Yes");
  }else{
    System.out.println("No");
  }  
}
}

```


###B問題

1!～10!円の硬貨をそれぞれ100枚ずつ持っている。
P円支払うためには、最低何枚の硬貨を使えばよいか？

こういう手順にしました。
・まず、1!～10!円硬貨のそれぞれの金額を計算して、10件の配列に入れる。
こうなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/0faf4470-c99f-fe48-0788-96f9620544a2.png)

・Pを、上記の配列の上から順番に割り算をして、商が1以上になっているところで
　残額を、P-配列*商で求める（商が、使う硬貨の枚数になる）

・上記を、Pに残額を入れて商が0になるまで繰り返す。

これで最小枚数の硬貨になります。

```java

import java.util.Scanner;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  long p   = sc.nextInt();
  long zanwk = p;
  long syo = 0;
  long cnt = 0;
  int  i = 9;
  char flg = '1';
  long rui[] = new long[10];
  rui[0] = 1;
  
  for(int j=1;j<10;j++){
    rui[j] = rui[j-1] * (j+1); 
    //System.out.println(rui[j]);
  }
  
  

  while(zanwk>0){
  i = 9;
  flg = '0';
  ///
  while(flg=='0'){
    syo = zanwk/rui[i];
    if(syo>0){
      flg='1';
      cnt = cnt + syo;
      //zanwk = zanwk - (i+1)*syo;
      zanwk = zanwk - (rui[i])*syo;
      //System.out.println(" syo " + syo + " i " + i + " zanwk " + zanwk);
    }
    i--;
  }
  ///
       
  }    
    
    
    System.out.println(cnt);
}
}


```


###C問題

N人の国民がいて、国民番号を割り振っている。
K個のお菓子を持っている。以下の手順で配っていく。
・お菓子がN個以上だったら、1個ずつ全国民に配る。
・N個未満だったら、国民番号の小さい順に配る。
国民番号の小さい順っていうのがねえ・・。

・お菓子がN<=Kだったら、N/K分のお菓子が「基本的な配る数」になる。
・余りについては、番号が小さい順に配る。ただ番号は小さい順に入力されるとは限らない。
なので、国民番号の配列と、それを昇順にソートした配列の2つを用意しました。
ここから下は例示で記載します。

---例---

お菓子は8個ある。国民は3人。
国民番号が、以下だとする。
15 3 4 

昇順にソートした配列は、以下になる。
3 4 15

まず、8個のお菓子は、2個ずつ全員に配られる。残り2つ。
残り2つは、小さい順に、3と4に配られる。
→4の国民番号まで配られることになる。

出力時に、は、
・i番目の配列の要素は、4以下であれば基本的な数+1、4より大きければ基本的な数をそれぞれ出力。

--------


```java

import java.util.Scanner;
import java.util.Arrays;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  long n = sc.nextLong();
  long k = sc.nextLong();
  int nsoe = (int)n;
  long a[] = new long[nsoe];
  long as[] = new long[nsoe];
  for(int i=0;i<nsoe;i++){
    a[i] = sc.nextLong();
    as[i] = a[i];
  }
  Arrays.sort(as);
  long zan = k;
  long syo = 1;
  long rui = 0;
  if(zan>=n){
    while(syo>0){
      syo = zan/n;
      zan = zan - n*syo;
      rui = rui + syo;
    }
  //nokori 2en dattara soeziha 1madekubarareru
  }else{
  }
  //System.out.println(" zan " + zan + " syo " + syo + " rui "  + rui);
  if(zan!=0){
  for(int j=0;j<n;j++){
    if(a[j]<=as[(int)zan-1]){
    //System.out.println(" a[j] " + a[j] + " as[(int)zan-1] " + as[(int)zan-1]);
    System.out.println(rui+1);
    }else{
    //System.out.println(" a[j] " + a[j] + " as[(int)zan-1] " + as[(int)zan-1]);
    System.out.println(rui);
    }
  }
  }else{
   //
   for(int j=0;j<n;j++){
    System.out.println(rui);
    }
   // 
  }
  
}
}


```


###さいごに
ここまで書いて振り返ると、残り55秒でC問題がACになったので、レートの更新もこんなもんかな？という感じです。ノーミスでABCを解けるのはいい気分なのでまあいいか。

でもこのままだと年内の茶色が危ういので、早く解けるように練習頑張ります。
このくらいで負けないぞ・・。ではまた。