AtCoder Beginner Contest #006 C問題 - スフィンクスのなぞなぞ

Source

AtCoder Beginner Contest #006
問題文

問題概要

$N$ 人の人間がいて,足の数は合計で $M$ 本である.
ただし,大人の足は $2$ 本,老人の足は $3$ 本,赤ちゃんの足は $4$ 本であるとする.
(大人の人数,老人の人数,赤ちゃんの人数)の組として考えられるものを1つ求める問題.
答えが存在しないならそれを指摘する.

解法

答えは複数あることもあり,どうやっても良い.
例えば,すべて老人であると仮定して,足が足りないならその分赤ちゃんを増やし,多すぎるならその分大人を増やすなど.
以下のコードは上の考え方をそのままに,場合分けに落として答えたもの.

C++によるスパゲッティなソースコード

#include<cstdio>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<string>
#include<utility>
#include<iostream>
#include<cmath>
using namespace std;

#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

void reader(int *x){int k,m=0;*x=0;for(;;){k=getchar_unlocked();if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){*x=k-'0';break;}}for(;;){k=getchar_unlocked();if(k<'0'||k>'9')break;*x=(*x)*10+k-'0';}if(m)(*x)=-(*x);}
void writer(int x, char c){int i,sz=0,m=0;char buf[10];if(x<0)m=1,x=-x;while(x)buf[sz++]=x%10,x/=10;if(!sz)buf[sz++]=0;if(m)putchar_unlocked('-');while(sz--)putchar_unlocked(buf[sz]+'0');putchar_unlocked(c);}

int main(){
  int i;
  int N, M;
  int A=-1, B=-1, C=-1;

  reader(&N);
  reader(&M);

  if(2*N<=M && M<=3*N){
    A = 3*N - M;
    B = N - A;
    C = 0;
  } else if(3*N<=M && M<=4*N) {
    A = 0;
    B = 4*N - M;
    C = N - B;
  }

  writer(A, ' ');
  writer(B, ' ');
  writer(C, '\n');

  return 0;
}

Current time: 2017年11月22日00時49分23秒
Last modified: 2014年05月24日04時09分35秒 (by laycrs)
Tags: Competitive_Programming AtCoder AtCoder_Beginner_Contest ABC006 ABC_C
トップページに戻る

Logged in as: unknown user (not login)

ログイン: