競技プログラミング

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hogged
記事: 17
登録日時: 9年前

競技プログラミング

#1

投稿記事 by hogged » 9年前

atocoderのこの問題(http://abc006.contest.atcoder.jp/tasks/abc006_3)を解いているのですが、
一部waしてしまい、何故なのかわかりません。

コード:

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <bitset>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pint;
typedef vector<int> vint;
typedef vector<pint> vpint;
#define mp make_pair
#define fi first
#define se second
#define all(v) (v).begin(),(v).end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define reps(i,f,n) for(int i=(f);i<(n);i++)
int dx[4] = {1, 0, 0, -1};
int dy[4] = {0, 1, -1, 0};
 
int main(void){
	int N, M;
	scanf("%d %d", &N, &M);
 
	int heikin = M / N;
	int amari = M % N;
 
	//自明的にこの2つの条件では解はない
	if (M < 2 * N){
		printf("-1 -1 -1\n");
		return 0;
	}
	if (4 * N < M)
	{
		printf("-1 -1 -1\n");
		return 0;
	}
 
	int otona, baba, baby;
	if (heikin == 2)
	{
		otona = N - amari;
		baba = amari;
		baby = 0;
	}else if(heikin == 3){
		otona = 0;
		baba = N - amari;
		baby = amari;
	}
 
	printf("%d %d %d\n", otona, baba, baby);
 
	return 0;
}
解き方としては、人、1人あたりの足の本数の平均を出して、heikin==2の時は足りない分を老人を増やすことで
heikin==3の時は足りない分を赤ちゃんを増やすことで、回答を求めました。
テスト例などでは出来てるのですが、提出すると出来ません。どこがいけないのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 競技プログラミング

#2

投稿記事 by みけCAT » 9年前

たとえば

コード:

1 4
を入力すると、解がない条件には該当せず、heikinが2でも3でもないので、
59行目で未初期化の自動変数otona, baba, babyの値を用い、未定義動作を起こします。
オフトピック
明らかにC言語ではないコードを囲むcodeタグに、明示的に言語としてcを指定するのは、良くないと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

hogged
記事: 17
登録日時: 9年前

Re: 競技プログラミング

#3

投稿記事 by hogged » 9年前

みけCAT さんが書きました:たとえば

コード:

1 4
を入力すると、解がない条件には該当せず、heikinが2でも3でもないので、
59行目で未初期化の自動変数otona, baba, babyの値を用い、未定義動作を起こします。
オフトピック
明らかにC言語ではないコードを囲むcodeタグに、明示的に言語としてcを指定するのは、良くないと思います。
なるほど。heikin == 4の時の処理がどこにも書いてありませんね。

コード:

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <bitset>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pint;
typedef vector<int> vint;
typedef vector<pint> vpint;
#define mp make_pair
#define fi first
#define se second
#define all(v) (v).begin(),(v).end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define reps(i,f,n) for(int i=(f);i<(n);i++)
int dx[4] = {1, 0, 0, -1};
int dy[4] = {0, 1, -1, 0};
 
int main(void){
	int N, M;
	scanf("%d %d", &N, &M);
 
	int heikin = M / N;
	int amari = M % N;
 
	//自明的にこの2つの条件では解はない
	if (M < 2 * N){
		printf("-1 -1 -1\n");
		return 0;
	}
	if (4 * N < M)
	{
		printf("-1 -1 -1\n");
		return 0;
	}
 
	int otona, baba, baby;
	if (heikin == 2)
	{
		otona = N - amari;
		baba = amari;
		baby = 0;
	}else if(heikin == 3){
		otona = 0;
		baba = N - amari;
		baby = amari;
	}else if(heikin == 4){
		otona = 0;
		baba = 0;
		baby = N;
 
	}
 
	printf("%d %d %d\n", otona, baba, baby);
 
	return 0;
}
上記のコードで通りました。ありがとうございました。
コード指定気をつけます。

hogged
記事: 17
登録日時: 9年前

Re: 競技プログラミング

#4

投稿記事 by hogged » 9年前

みけCAT さんが書きました:たとえば

コード:

1 4
を入力すると、解がない条件には該当せず、heikinが2でも3でもないので、
59行目で未初期化の自動変数otona, baba, babyの値を用い、未定義動作を起こします。
オフトピック
明らかにC言語ではないコードを囲むcodeタグに、明示的に言語としてcを指定するのは、良くないと思います。
なるほど。heikin == 4の時の処理がどこにも書いてありませんね。

コード:

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <bitset>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pint;
typedef vector<int> vint;
typedef vector<pint> vpint;
#define mp make_pair
#define fi first
#define se second
#define all(v) (v).begin(),(v).end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define reps(i,f,n) for(int i=(f);i<(n);i++)
int dx[4] = {1, 0, 0, -1};
int dy[4] = {0, 1, -1, 0};
 
int main(void){
	int N, M;
	scanf("%d %d", &N, &M);
 
	int heikin = M / N;
	int amari = M % N;
 
	//自明的にこの2つの条件では解はない
	if (M < 2 * N){
		printf("-1 -1 -1\n");
		return 0;
	}
	if (4 * N < M)
	{
		printf("-1 -1 -1\n");
		return 0;
	}
 
	int otona, baba, baby;
	if (heikin == 2)
	{
		otona = N - amari;
		baba = amari;
		baby = 0;
	}else if(heikin == 3){
		otona = 0;
		baba = N - amari;
		baby = amari;
	}else if(heikin == 4){
		otona = 0;
		baba = 0;
		baby = N;
 
	}
 
	printf("%d %d %d\n", otona, baba, baby);
 
	return 0;
}
上記のコードで通りました。ありがとうございました。
コード指定気をつけます。

閉鎖

“C言語何でも質問掲示板” へ戻る