読者です 読者をやめる 読者になる 読者になる

堕(惰)プログラマ開発記録

タイトル変えようかなとも思ってるけれど,思い浮かばない

JOI 2011/2012

C++ NIT,Tokyo College

自分で解けたと思われるコードおいておきます.ですから問4以降のコードはノーコメント.
間違ってたり,桁あふれて,Wrong Answerもらう確率大です.くれぐれも参考程度で.


というわけで,以下,問1〜3のコードです.
すべてC++で書かれています.

問題1

問1はパスタとジュースのセット(合計金額-50)の最安値を出す問題です。
1行目〜3行目:パスタの値段
4行目〜5行目:ジュースの値段

//問1
#include <iostream>

int main()
{
  int pasta=10000,juice=10000,tmp;
  for(int i=0;i<3;++i)
  {
    std::cin >> tmp;
    pasta = std::min(tmp,pasta);    
  }
  for(int i=0;i<2;++i)
  {
    std::cin >> tmp;
    juice = std::min(tmp,juice);    
  }
  std::cout << pasta+juice-50 << std::endl;

  return 0;
}

問題2

問2はサッカーのチーム数と総当たりの結果から勝ち点を比較し、チーム番号順に順位を出力します。
一行目:チーム数
二行目以降:A B C Dのスペース区切り(A,Bの点数はそれぞれC,D点)
ただし勝ち点は勝ち3点、引き分け1点、負け0点とする。

//問2
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

struct team_result{
  team_result(int n)
  {
    name = n;
    result = 0;
  }
  int name;
  int result;
  int number;
};

bool sort(const team_result& lv,const team_result& rv)
{
  return lv.result > rv.result;
}

int main()
{
  std::vector<team_result> match;
  int team;
  std::ifstream is("q.txt");
  is >> team;

  for(int i=1;i<=team;++i)
  {
    match.push_back(team_result(i));
  }

  std::vector<team_result> sorted(match);

  team = team * (team - 1) / 2;

  int A,B,C,D;
  for(int i=0;i<team;++i)
  {
    is >> A >> B >> C >> D;
    if(C == D)
    {
      ++match.at(A-1).result;
      ++match.at(B-1).result;
    }
    else if(C > D) match.at(A-1).result += 3;
    else if(D > C) match.at(B-1).result += 3;
  }

  std::sort(match.begin(),match.end(),sort);
  
  int now = 500;
  int now_num = 0;
  for(std::vector<team_result>::iterator it = match.begin();it != match.end();++it)
  {
    if(it->result == now) sorted.at(it->name-1).number = now_num;
    else
    {
      sorted.at(it->name-1).number = ++now_num;
      now = it->result;
    }
  }

  std::ofstream os("ans.txt");
  for(std::vector<team_result>::iterator it = sorted.begin();it != sorted.end();++it)
  {

    os << it->number << "\r\n" << std::flush;
  }
  os.close();

  return 0;
}

問題3

問3はピザの生地とトッピングの値段、ピザ生地のカロリーとそれぞれのトッピングの値段を渡されます。
値段に対してのカロリーが最大の結果を出力します。
1行目:トッピングの数
2行目:生地とトッピング値段がスペース区切り
3行目:生地のカロリー
4行目〜:トッピングの数数だけのカロリー列挙

//問3
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

bool sort(const int lv,const int rv)
{
  return lv>rv;
}

int main()
{
  int topi,A,B,C;
  std::vector<int> v;
  std::ifstream is("q.txt");
  is >> topi;
  is >> A >> B;
  is >> C;
  for(int tmp,i=0;i<topi;++i)
  {
    is >> tmp;
    v.push_back(tmp);
  }
  std::sort(v.begin(),v.end(),sort);

  int now_d=A,now_c=C;
  int now_r = now_c / now_d;
  int tmp_c,tmp_d,tmp_r;
  for(std::vector<int>::iterator it = v.begin();it != v.end();++it)
  {
    tmp_c = now_c+*it;
    tmp_d = now_d+B;
    tmp_r = tmp_c / tmp_d;
    if(tmp_r > now_r)
    {
      now_c = tmp_c;
      now_d = tmp_d;
      now_r = tmp_r;
    }
    else break;
  }

  std::cout << now_r << std::endl;
  return 0;
}

最後に

予選落ちましたねっ!
というかストリームcloseし忘れちゃった(てへぺろ