C言語
1#include<stdio.h> 2int amari(int , int); 3int kosuu(int, int); 4int keisan(int, int); 5int sum = 0, min = 11; 6 7int main(void){ 8 int n, m, kans = 0; 9 scanf("%d%d", &n, &m); 10 int i, k, ans = 100; 11 if(n == 1){ 12 k = 1; 13 }else{ 14 for(i = 1 ; i < n ; i++){ 15 if(i*i*i > n){ 16 k = i-1; 17 break; 18 } 19 } 20 } 21 for(;k > 1;k--){ 22 kans = keisan(n, k); 23if(kans < ans){ 24 ans = kans; 25 } 26 sum = 0; 27 } 28 if(ans <= m){ 29 printf("%d\n", ans); 30 }else{ 31 printf("-1\n"); 32 } 33} 34 35int amari(int n, int p){ 36 return n % (p*p*p); 37} 38 39int kosuu(int n, int p){ 40 return n / (p*p*p); 41} 42int keisan(int n, int k){ 43 int q = 0; 44 if(k != 1){ 45 sum += kosuu(n, k); 46 keisan(amari(n, k), k-1); 47 }else{ 48 sum += n; 49 } 50 return sum; 51} 52 53 54```競技プログラムの問題を教えていただきたいです。(C言語でお願いいたします) 55【問題原文】 56正整数 n と m が与えらえるとき,n を m 個以下の立方数(正整数の三乗)の和で表現することを考える. 57例えば,n = 35,m = 10 のとき,n は次のように立方数を使って表現できる 5835 = 33 + 23 5935 = 33 + 13 + 13 + 13 + 13 + 13 + 13 + 13 + 13 6035 = 23 + 23 + 23 + 23 + 13 + 13 + 13 61正整数 n が m 個以下の立方数の和として表現できるとき,必要な立方数の最小個数を調べるプログラムを作成せよ. 62(入力) 63入力は以下の形式で与えられる. 64n m 65(制約) 66・n,m はいずれも正整数. 67・1 ≤ n ≤ 50000 68・1 ≤ m ≤ 10 69(出力) 70正整数 n を表現するのに必要な立方数の最小個数を出力せよ. ただし,n が m 個以下の立方数の和で表現できないときには -1 と出力せよ. 71(例) 72入力1: 7335 10 74出力1: 752 7635 を表現するのに必要な立方数の最小個数は2個である(35 = 33 + 23). 77入力2: 7853 3 79出力2: 80-1 8153 を3個以下の立方数の和として表現することはできない. 82 83自分で作成したソースコードを載せさせていただきました。 84上記のコードでは例の入力1, 2には対応できているのですが、自分でほかの値で試したときに正しい値を出力しませんでした。(具体的にはn=4059, m=10この場合の正しい答えは12^3+11^3+10^3で3、自分のコードでは5と出てしまいます。) 85理由はわかっているのですが、改善方法がわかりません。
どこまで実装してみましたか?
まずはあなたのコードを提示しましょう
競技プログラムならなおさら
返信ありがとうございます。
ソースコードを張らせていただきます。
#include<stdio.h>
int amari(int , int);
int kosuu(int, int);
int keisan(int, int);
int sum = 0, min = 11;
int main(void){
int n, m;
scanf("%d%d", &n, &m);
int i, k, ans;
for(i = 1 ; i < n ; i++){
if(i*i*i > n){
k = i-1;
break;
}
}
ans = keisan(n, k);
if(ans <= m){
printf("%d\n", ans);
}else{
printf("-1\n");
}
}
int amari(int n, int p){
return n % (p*p*p);
}
int kosuu(int n, int p){
return n / (p*p*p);
}
int keisan(int n, int k){
if(k != 1){
sum += kosuu(n, k);
keisan(amari(n, k), k-1);
}else{
sum += n;
}
return sum;
}
上記のコードでは例の入力1, 2には対応できているのですが、自分でほかの値で試したときに正しい値を出力しませんでした。
質問文は編集できますんで、そこにコードを貼ってください
コードは、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
一応提出もしてみたのですが、WRONG-ANSWERではなくRUN-ERROER判定となってしまいました。
指摘ありがとうございます。
質問文を編集させていただきます。
指摘ありがとうございます。
yahoo知恵袋の方は削除させていただきました。
> 35 = 33 + 23
35 = 3^3 + 2^3 または 35 = 3**3 + 2**3 と書いてほしい。
最初見た時、なんだこれ?、と思いました。
回答3件
あなたの回答
tips
プレビュー