paiza問題メモ
code:c
int main(void){
//取得用配列
//収穫物格納配列
//a->b行,c->d列,作物e
//植える作物
//収穫した作物の数カウント
//n:回数,m:種類,h:行数,w列数の初期化
int n=0;
int m=0;
int h=0;
int w=0;
//カウント用変数
int i,i2,j,k;
//回数、種類の取得
fgets(str, sizeof(str), stdin);
sscanf(str,"%d %d",&n,&m);
//行数、列数の取得
fgets(str,sizeof(str),stdin);
sscanf(str,"%d %d",&h,&w);
//i期の作業範囲を取得
for(i=0;i<n;i++){
fgets(str,sizeof(str),stdin);
sscanf(str,"%d %d %d %d %d",&ai,&bi,&ci,&di,&ei); }
//n回分ループ、作物カウント
for(i=0;i<n;i++){
//作物を植える。
for(j=ai;j<=bi;j++){ //aからbの範囲を指定 for(k=ci;k<=di;k++){ //cからdの範囲を指定 //作物があるか確認
if(emjk != 0){ //作物が埋まっている時(0以外の時) for(i2=0;i2<MMAX;i2++){
//植えてある作物を確認
if(emjk == ei2)ecnti2++; //植えてある作物の数を+1 }
}
}
}
}
//出力処理
//作物の数を出力
for(i=0;i<m;i++){
}
//最後の畑の状態を出力
for(j=1;j<=h;j++){ //取得した畑の行分ループ
for(k=1;k<=w;k++){ //取得した畑の列分ループ
//植えられている作物を確認
//作物が植えられて無い時
printf(".");
}else{ //作物が植えられている時
printf("%d",emjk); //作物を出力 }
}
printf("\n"); //改行
}
return 0;
}
カードを2枚抽出し、その2枚を+1,-1
カードすべての積を求める。
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
char *strp; //strポインタ
//カード枚数取得
int n;
int mul=1; //掛け算結果
int mulmax=0; //一個前の掛け算
int i,j,k; //ループ用変数
//カード数値取得
//比較用変数を用意
int h1,h2;
//カード枚数取得
fgets(str, sizeof(str),stdin);
sscanf(str,"%d",&n);
strp = str;
//カード枚数の値分だけ、2行目の数値を取得
fgets(str, sizeof(str),stdin);
for(i=0;i<n;i++){
//fgets(str,sizeof(str),stdin);
strp = strchr(strp,' ')+1;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i!=j){
//掛け算の計算
for(k=0;k<n;k++){ //枚数分ループ
if(k==i){ //k==iの時はh1をかける
mul *= h1;
}else if(k==j){ //k==jの時はh2をかける
mul *= h2;
}else{ //kがi,j以外の時はそのままかける。
}
}//掛け算終了
}
if(mulmax<mul){ //最大値の更新
mulmax = mul;
}
mul =1; //mul(掛け算結果)初期化
}
}
printf("%d",mulmax);
return 0;
}
上記問題の修正
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
char *strp; //strポインタ
int n = 6; //カード枚数取得
int mul = 1; //掛け算結果格納用変数
int mulmax=0; //掛け算の最大値格納用変数
char mulmaxf = 0;
int i,j,k; //ループ用変数
//カード数値取得
//比較用変数を用意
int h1,h2;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i!=j){
mul = 1; //mul(掛け算結果)初期化
//掛け算の計算
for(k=0;k<n;k++){ //枚数分ループ
if(k==i){ //k==iの時はh1をかける
mul *= h1;
}else if(k==j){ //k==jの時はh2をかける
mul *= h2;
}else{ //kがi,j以外の時はそのままかける。
}
}//掛け算終了
printf("i:%d,j:%d,mul=%d\n",i,j,mul);
//最初の1回目は、mulmax=mulとする。
if(mulmaxf != 1){
printf("mul1 = %d\n",mul);
mulmax = mul;
mulmaxf = 1;
printf("mulmax1 = %d\n",mulmax);
}
}
if(mulmax<mul){ //最大値の更新
printf("mul=%d\n",mul);
mulmax = mul;
}
}
}
printf("MAX=%d",mulmax);
return 0;
}
送りたい文字列の周囲を+++で枠で囲んで装飾する。
code:c
///文字列から\nを抜く関数
///引数: char *str 文字列
///return: none
void chomp(char* str) {
///文字列の長さを取得
int len = strlen(str);
///文字列の長さが0より大きい時かつ
///最後の文字が\nの時
if (len > 0 && strlen - 1 == '\n') { strlen - 1 = '\0'; //文字列の最後の文字をnullにする。 }
}
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int mozicnt; ///文字数カウント用
int i; ///カウント用変数
fgets(str, sizeof(str), stdin);
for(mozicnt=0;strmozicnt!='\0';mozicnt++); for(i=0;i<=mozicnt;i++){
printf("+");
}
printf("\n");
chomp(str);
printf("+%s+",str);
printf("\n");
for(i=0;i<=mozicnt;i++){
printf("+");
}
return 0;
}
長さ N の文字列 S が与えられます。S に含まれている各文字の出現回数をそれぞれ求め、「a」の出現回数、「b」の出現回数、...、「z」の出現回数をこの順に半角スペース区切りで1行に出力してください。
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int num; //文字数
int i;
int cntMAXN={}; //文字カウント用配列 fgets(str, sizeof(str), stdin);
sscanf(str,"%d",&num);
fgets(str,sizeof(str),stdin);
//無理やりやった場合
//文字数分ループ
for(i=0;i<num;i++){
}
//番号の数分ループ
for (int i = 0; i < num; i++) {
//aからzの文字列の時
if ('a' <= stri && stri <= 'z') { //文字列カウント+1
}
}
for(i=0;i<26;i++){
if(i!=25)printf(" ");
}
return 0;
}
code:c
//番号の数分ループ
for (int i = 0; i < num; i++) {
//aからzの文字列の時
if ('a' <= stri && stri <= 'z') { //文字列カウント+1
}
}
このコードは、文字列中の文字を1つずつ取り出して、それが'a'から'z'の範囲にあるかどうかをチェックします。文字が'a'から'z'の範囲にある場合、cnt配列の適切な位置('a'が0番目、'b'が1番目、...、'z'が25番目)にカウントをインクリメントします。
具体的には、文字列中の文字を1つずつ取り出すためにforループが使用され、
カウントを更新するためにcnt配列が使用されます。
if文で、文字が'a'から'z'の範囲にある場合、その文字に対応するcnt配列の要素が1つ増えます。
文字のASCIIコードから'a'のASCIIコードを引くことで、文字に対応するcnt配列の添字を計算しています。
cnt[stri - 'a']++;は、文字列strのi番目の文字が'a'から'z'の範囲内にある場合、対応するアルファベットの出現回数を1増やす処理です。 stri - 'a'は、文字列strのi番目の文字がアルファベットの何番目にあたるかを計算しています。たとえば、striが文字'a'であれば、'a' - 'a'の計算結果は0となり、cnt0の値が1増えます。同様に、striが文字'z'であれば、'z' - 'a'の計算結果は25となり、cnt25の値が1増えます。 こうしてcnt配列の各要素には、それぞれ対応するアルファベットの出現回数が格納されることになります。
code:c
int main(void){
//配列の宣言
int AAMAX; ///ゴンドラの乗車可能人数 int AcntBMAX; ///ゴンドラに乗った人数カウント用配列 int n; //n:ゴンドラの数
int m; //m:グループの数
int i; //カウント用変数
int j = 0; //ゴンドラ設定用変数
int hr= 0; //グループの残り人数
fgets(str, sizeof(str), stdin);
sscanf(str,"%d %d",&n,&m);
//printf("n:%d,m%d\n",n,m);
///ゴンドラ乗車可能人数取得
for(i=0;i<n;i++){
fgets(str,sizeof(str),stdin);
//printf("A:%d=%d\n",i,Ai); }
///グループ人数取得
for(i=0;i<m;i++){
fgets(str,sizeof(str),stdin);
//printf("B:%d=%d\n",i,Bi); }
//配列の初期化
memset(Acnt,0,sizeof(Acnt));
///グループの数ループ
for(i=0;i<m;i++){
///残りの人数取得
///グループの残りの人数が0人になるまでループ
while(hr>0){
///残りの人数確認
if(hr <= Aj){ ///残りの人数がゴンドラの乗車可能人数以下の時 Acntj += hr; ///乗車人数を残りの人数分加算 hr = 0; ///残りの人数が0人
}else{ ///残りの人数がゴンドラの乗車可能人数を超えてる時
Acntj += Aj; ///乗車人数を、乗車可能人数分加算 hr = hr - Aj; ///グループの残りの人数を算出 }
j++; ///ゴンドラを次のゴンドラに移動
if(j==n)j=0; ///ゴンドラが最後まで回った時、ゴンドラを1に戻す。
}
}
///乗車人数算出
///ゴンドラの数だけループ
for(i=0;i<m;i++){
printf("%d\n",Acnti); ///ゴンドラの乗車数を出力 }
return 0;
}
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int m = 10; ///m:仕入れkg,p:販売%,q残りの販売% int q = 31;
int p = 52;
int m2; ///新鮮野菜の売れ残り
float ans; ///最後残った量
//仕入れkg,販売%,売れ残り%を取
//新鮮野菜の売れ残り
m2 = m*(100 - p);
//最後残った量
ans = m2*(100 - q)/10000.0;
printf("%f", ans);
return 0;
}
入力:
N:車の数:number of cars
M:渋滞と判定する長さ(m):traffic jam
車間距離(m):Inter-vehicular distance
出力:
渋滞の区間合計長さ(m)
末尾に改行を入れる
処理:
渋滞条件:
渋滞と判定する長さMより車間距離Aが短い場合
渋滞の長さ = 渋滞と判定された車間距離の合計
入力
N:来店するとキャンペーンの対象から外れる期間の日数を表す整数
M:キャンペーンの対象となる期間の日数を表す整数
S:直近 M 日間のうち i 番目に来店した客の名前を表す文字列 S
出力
キャンペーン対象となる客の数
処理
N,M, S取得
S1,2,3,4,5,6
M=6でN=3のとき
キャンペーン期間を算出
Kanp = M - N
キャンペーン期間に来た客を算出
SiをKanpでループ:キャンペーン対象客を算出
S1 = S2, S1= S3 ・・・キャンペーン内ループで重複確認
S2 = S3, S2= S4 ・・・ キャンペーン期間中ループ
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int N,Mnum; //N:キャンペーンが外れる期間 M:キャンペーン期間
int cnt,cnt2; //ループカウント用変数
int kyanpperiod; //キャンペーン期間
int customnum; //キャンペーン対象のお客さんの数
fgets(str, sizeof(str), stdin);
sscanf(str,"%d %d",&N,&Mnum);
//お客さんを取得
for(cnt = 0; cnt<Mnum; cnt++){
fgets(str2cnt,sizeof(str),stdin); }
//キャンペーン期間を算出
kyanpperiod = Mnum - N;
//キャンペーン内のお客さんの数を初期化
customnum = 0;
//キャンペーン内のお客さんを確認
for(cnt = 0; cnt<kyanpperiod;cnt++){
//キャンペーン内のお客さんを+1する。
customnum += 1;
//重複確認
for(cnt2=1;cnt2<kyanpperiod;cnt2++){ //複数回来ている時、-1する。
//お客さんの重複確認
if(res==0){
//printf("zyuuhuku\n");
customnum -= 1;
}
}
}
printf("%d",customnum);
return 0;
}
入力:N,W 行数、列数
S1,S2,S3・・・
S2-1,S2-2,S2-3・・・
y x :文字列を書き換える y行 x列
y,x,h
高さL1cm以下
入力
N :折り紙の枚数
D:1辺の長さ
i+1枚目の折り紙がi枚目の折り紙に何cm重なっているか。
入力:
英語文字列
出力
aiueoの子音を抜く。
処理
英語文字列取得
一文字ずつ確認
文字列を確認
aiueoの場合は、何もしない。
それ以外の場合は、出力用配列に入力
出力
子音を無視する
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int i; //カウント用変数
fgets(str, sizeof(str), stdin);
for(i=0;i<strlen(str);i++){
case 'a':
case 'i':
case 'u':
case 'e':
case 'o':
case 'A':
case 'I':
case 'U':
case 'E':
case 'O':
//何もしない
break;
default:
}
}
return 0;
}
入力:
単語数:N
文字列(単語)
出力
しりとりが成立しない場合
初めてしりとりが成立しなかった 2 つの連続する単語の
1 つめの単語の末尾の文字と
2 つめの単語の先頭の文字
を出力
成立する場合
Yes
と出力する。
処理
Nを取得
単語の文字列を取得
1単語目の最後の文字と2単語目の最初の文字を確認
一致する場合
次の単語確認へ移動
一致しない場合
1単語目の最後の文字と2単語目の最初の文字を出力
処理終了
2単語目の最後の文字と3単語目の最初の文字を確認
一致する場合
一致しない場合
・・・
i番目の最後の文字とi+1番目の最初の文字を確認
・・・
N-1番目の最後の文字とN番目の最初の文字を確認
一致する場合
Yesを表示
一致しない場合
1単語目の最後の文字と2単語目の最初の文字を出力
処理終了
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int N; ///単語数
int i; ///カウント用変数
fgets(str, sizeof(str), stdin);
sscanf(str,"%d",&N);
for(i=0;i<N;i++){
fgets(wordi,sizeof(word), stdin); //単語の位置確認
if(i > 0){ ///<2単語目から確認する。
///単語の一致確認
if(wordi-1[numi-1] == wordi0) { ///<単語が一致する場合 //最後の時
if(i == N-1) printf("Yes"); //Yesを出力
//最後以外は何もしない
}else{ ///<単語が一致しないとき
printf("%c ",wordi-1[numi-1]); break;
}
}
}
return 0;
}
入力
ログの桁数:N
エレベータが止まった階 :F
出力
エレベータが何階分動いたか。
処理
動いた階数の算出
1回→F1回
動いた階数:|F1 - 1| = 3 - 1 = 2
F1回→F2回
動いた階数:|F2 - F1| = 3-1 = 2
F2回→F3回
動いた階数:|F3 - F2| = 1 - 4 = 3
全ての動いた階数の合計を算出
ログ数取得
ログごとの階数数値を取得
1回前の階数 - 今回の階数の絶対値を算出
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int numflooNMAX; ///< 止まった階数 int N; ///< ログ数
int i; ///< カウント用変数
int numfloodiff; ///階数の差(絶対値)
int numfloosum = 0; ///階数差の合計
fgets(str, sizeof(str), stdin);
sscanf(str,"%d",&N);
for(i=0;i<N;i++){
///階数を取得
fgets(str,sizeof(str),stdin);
sscanf(str,"%d",&numflooi); ///回数確認
if(i == 0) {
numfloosum = abs(numflooi-1); }
else{ ///<1回目は、初期一の為無視
///1回前の階数と今回止まった階数の差の絶対値を算出
numfloodiff = abs(numflooi-1-numflooi); ///階数の差の合計を算出
numfloosum += numfloodiff;
}
}
printf("%d",numfloosum);
return 0;
}
入力
N:はじめのチャージ金額
M:バスの乗車階数
f:i回目の降車時にかかった運賃
出力
毎回の降車時のカード残高とポイント数
処理
最初の金額取得
乗車回数取得
1回目の降車金額取得
残りの残高算出 = 最初の金額 - 1回目の降車金額
ポイント取得額 =1回目の降車金額 * 0.1
2回目の降車金額取得
ポイント確認:
降車金額未満の場合、残高から払う。
ポイント算出
ポイント合計
ポイントが降車金額を超えている場合、ポイントで払う。
入力
a:親カード情報:1つ目の番号 (1-10)
b:親カード情報:2つ目の番号 (1-4)
n:整数n(iの入力数)
Ai,Bi:子カード情報A,B
出力
iカードの強弱
子<親:High
親<子:Low
ルール:
1つめの番号が大きい方が強い
1つめの番号が同じ場合、2つ目の番号が小さい方が強い
処理
入力:
N:日数
s_i:現地出発時間
f_i:飛行機乗車時間
t_i:到着時間
出力:
N日間で最も短い1日の時間
N日間で最も長い1日の時間
ルール
パイザ氏の 1 日の時間:滞在している場所の時計で 0 時を見てから、移動した場合は移動先の時計で次の日の 0 時を見るまでの時間
飛行機の機内で日付をまたぐことがない:飛行機に乗った時の現地時刻での日付と飛行機から降りた時の現地時刻での日付は常に同じ
朝10
フライト:6
到着:20
時差:20-6-10 = 4
パいざ氏の時間= 24 -4 =20
12
3
8
時差:8-3-12 = -7
パイざし:24 -(- 7) = 31
1回目は、最大値と最小値に入れる。
2回目以降
最小値確認
最大値確認
更新
処理:
入力:
s:文字列
出力:
ダイヤルの回す回数
処理:
文字列から数値を取得する。
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int i;
int kyori;
int kyorisum = 0;
fgets(str, sizeof(str), stdin);
for(i=0;i<strlen(str)-1;i++)
{
case '-':
//何もしない。
break;
default:
//数値を取得
kyori = 12 * 2;
}else{
}
kyorisum += kyori;
break;
}
}
printf("%d",kyorisum);
return 0;
}
code:c
int main() {
int i = 0;
printf("文字列を入力してください:");
fgets(str, 100, stdin); // 標準入力から文字列を取得する
while (stri != '\0') { // 文字列の終端文字に達するまでループ int num = stri - '0'; // 文字を数値に変換する printf("%d ", num); // 数値を出力する
i++; // 次の文字に進む
}
return 0;
}
上記のコードでは、fgets関数を使って標準入力から文字列を取得しています。取得した文字列を1文字ずつループで処理し、各文字を数値に変換して出力しています。文字を数値に変換するために、ASCIIコードで表された文字から'0'のASCIIコードを引くことで数値に変換しています。
入力:
xc:
yc:
r1:
r2:
x1,y1
・・・
xn,yn
出力:
Yes,No (嵐の中にいるかどうか)
居る場合:yes
居ない場合:no
処理:
入力
n:日数
s1:開始
e1:終値
h1:高嶺
l1:安値
出力:n日間のs,e,h,lを出力
三角形ABCの辺BC上に、点Dをとり、三角形ABDの外接円をω1、三角形ACDの外接円をω2とする。
点Bを通る円ω1の接戦をl1、点Cを通る円ω2の接線をl2とし、
l1とl2の交点をEとする。
さらに、直線AEと円ω1、ω2の交点の内A出ないものを、P,Qとし、直線ACと直線DPの交点をR,直線ABと直線DQの交点をSとする。
このとき、4点A,D,R,Sが同一円周上にあり、その円は直線BCと接することを示してください。
入力:文字列
出力:reetに合わせて、文字列を変更した文字
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int i; ///カウント用
fgets(str, sizeof(str), stdin);
for(i=0;i<strlen(str);i++){
case 'A':
break;
case 'E':
break;
case 'G':
break;
case 'I':
break;
case 'O':
break;
case 'S':
break;
case 'Z':
break;
}
}
printf("%s", str);
return 0;
}
入力
ルール:
数式は全て2個以上の整数の足し算
使用する整数:1<=n<=99
連続する
<の数が整数の10の位
/の数が整数の1の位
+:足し算
入力
n:箱の数
r:ボールの半径
h1:箱の高さ
w1:幅
d1:奥行き
出力:ボールが収納できる箱の番号を昇順で
code:c
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
int n,r;
int i; //カウント用変数
fgets(str, sizeof(str), stdin);
sscanf(str,"%d %d",&n,&r);
for(i=0;i<n;i++){
fgets(str,sizeof(str),stdin);
sscanf(str,"%d %d %d",&hi,&wi,&di); ///全ての、高さ、幅、奥行きが、rの大きさ確認
if(r*2<=hi && r*2<=wi && r*2<=di){ ///全ての、高さ、幅、奥行きが、rより大きい場合 ///箱に入る。
///箱の番号を出力
printf("%d\n",i+1);
}
}
return 0;
}
入力
M:Aのライブの日数
a_i...:Aバンドのi番目のライブの日(1<a_i<31)
N:Bのライブ日数
b_i...:Bバンドのi番目のライブの日(1<b_i<31)
出力
i日目にA又はBに行く文字列(AorB)
ライブがない日は、X
処理
ライブが重なっていない日
A or Bのライブがある方にいく。
ライブが重なった日
バンドAから、AとBを交互に行く。
ログフィルター
入力:
N:文字列の数
G:抽出する対象の文字列
S_i:ログの文字列(1<i<N)
出力:
抽出する対象の文字列を含んだ文字を順番に出力
抽出対象の文字列を含んだ文字がない場合は、NONE
処理:
抽出対象があるかどうか確認
入力
くじの当選番号(6個)
購入したくじの枚数
i番目のくじの数字
出力
当選番号と一致する数字を答える。
処理
code:c