Open6

AtCoder

melsmels

可変の値を変数に入れる時!

C言語だと変数に後処理で「追加追加追加!!!」みたいなのが出来ないカスなので😢
mallocという関数を使って可変で値を受け取る事が出来るようにします

入力例
3 //これから3個の値がきますよ〜(受け取る個数)
10 20 30 //ほれほれ〜
出力例
10 20 30
int n,*a; //*aで指定する理由はaは配列になるため*で指定しなければならない

scanf("%d", &n); //受け取る変数の数N個とした場合
a = (int *)malloc(sizeof(int) * n); //(int *)は強制方変換で調べて!!

for (int i = 0; i < n; i++)
    scanf("%d",&a[i]); //面白いことにC言語ってifとかforとかの処理が一行なら{}なしでもいいんですよね

for (int i = 0; i < n; i++) 
{
    printf("%d ", a[i]); //上と下どっちも同じ意味:)
}

free(a);//出力して全ての動作が終わったら!!

return (0);

備考

https://zenn.dev/ytaki0801/articles/c5a5cb8fc5306c052a0a

melsmels

変数の比較の最小値どうすればええねん!

問題:それぞれの数列NとMから 1 つずつ要素を選んだときの 2 つの値の差の最小値
・最小値は0以上

入力例
2 3 //Nは2個受け取りますよ Mは3個受け取りますよ
1 6 //「N1は1」 「N2は6」
4 9 10 //「M1は4」 「M2は9」「M3は10」

NとMを比較するときの最小値どう設定すればええねん!
1000000000とか意味のないデカい数字を勝手に設定していいのか疑問に思ってました...😢

最初に設定したダメな例
MIN = N[1] -  M[1];

でもこれだと、1 - 4 = -3になてしまい条件が満たされません😭

じゃあ ループで正の数になるまでやればええんか?? と思ったけど、隣にいるイケメンに聞いたら
普通にINT_MAXの値を入れてました (そりゃそうじゃん)

正解
#include<limits.h> //INT_MAXを使えるようにするinport文
MIN = INT_MAX;

一体自分は何に悩んでたのでしょうか😇
INT_MAXは確かに100万みたいな不可解なデカい数字じゃないし...しっくりきたし...俺バカじゃん😀

melsmels

意外と知らないscanfは捻くれ者

scanfって普通に使っても動くんだけど...

#include<stdio.h>
int A:
scanf("%d", &A);

これだと警告が出るんですよね

な の で
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

#include<stdio.h>
int A:
(void)scanf("%d", &A); //(void)で戻り値を指定してあげる

という形にしたんですよね... そしたら

なんと同じエラー吐きましたコイツ😠😠😠
なんでダメなのか路頭に迷ってました...
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
別解としてこんなやり方が...

if (scanf("%d", &a) < 1)
    return (1);

これだとうまく行くんですよ!!
これは戻り値をちゃんとチェックするらしいです!

まとめ! ぶっちゃけこの違いは??

(void)scanf("%d", &a);

これは戻り値を明示的に"無視"するために使われています。
正式な値が入った場合はそのままです!

if (scanf("%d", &a) < 1)
    return (1);

これは戻り値をチェックしています、もし"失敗"した場合は戻り値に-1が入ります
正式な値が入った場合はそのままです!

melsmels

計算時間に関して1

AtCoderは計算時間に厳しいっす 実行時間2秒以上は全部殺されます:(
O(N×M)の場合は全部探索出来るけど 全通り試すので計算量がアホです

そ の た め

O(NlogN+MlogM) という形で計算するととても効率的らしいです
要はNの配列とMの配列をソートしてから、最小値だけ入れると爆速やで😀って話です

ソートは下記のを使います(qsort)

int compare(const void *a, const void *b)
{
    return *(int*)a - *(int*)b;
}

main(){
    int arr[] = {4, 2, 5, 3, 1};
    qsort(arr, n, sizeof(int), compare);
}

arr : ソートしたい配列の最初の要素へのポインタ
n : ソートする配列の要素数
sizeof(int) : ソートする配列のデータ一つ分のバイト数
compare : ソートをするための比較関数へのアドレス

melsmels

今日からC++でやる!!

C C++ 覚え方
出力 printf cout しーあうと
入力 scanf cin しぃん
改行 \n endl えんどる
char[] string すとりんぐ

まーこんな感じの差しかないかな

出力する時

#include <iostream>
using namespace std; //なんかプログラムを短く書くための機能だってさ〜 ごま塩さんをつけなくても動くよ〜って感じらしい
int main()
{
    cout << "Hello Would"<< endl;
}

こう書かなきゃいけないの めんどくさいよね〜

string使えるの最強すぎな🥹🥹🥹🥹🥹🥹🥹🥹

boolつよいって〜

bool a = 10 //true
melsmels

C++割と便利ぢゃん!

まーじびっくりした Cだとcharしか使えない💩だったけど
string優秀すぎる😢😢

下記は特定の文字列の頭文字だけ出力する C++

#include <bits/stdc++.h>
using namespace std;
int main()
{
  string a,b,c;
  cin >> a >> b >> c;
  cout << a.at(0) << b.at(0) << c.at(0) << endl;
}

cだと文字の長さ測って...一個一個参照して...みたいなことをしてたけど!

[変数].size() 変数の長さを取得
[変数].at(0) 変数の0番目を選択

こんなに簡単になるだなんて感動ですわ!!