wanimaru47's diary

プログラミング等々

QUPCの結果!!

ドイツから帰国して、久しぶりのプロコンでした。
出来から言えば力技で解ける問題しか解けず、ICPCへの道が遠く感じる結果になりました。
解説も出ましたが、自分のコードを上げたと思います。

・A問題
 この問題は最低合格人数でその時の最高点を求める問題なので、問題の意図通り最高点から段々得点を小さくして、最低合格人数を超える最高合格点を見つけます。

#include <iostream>
#define MAX 11
using namespace std;

int main()
{
     int a, b, c, d;
     int data[MAX][MAX];
     cin >> a >> b >> c >> d;
     for (int i = 0; i < c; i++) {
	  for (int j = 0; j < a; j++) {
	       cin >> data[i][j];
	  }
     }

     int res;

     for (res = 100; res >= 0; res--) {
	  int count = 0;
	  for (int j = 0; j < c; j++) {
	       int tmp = 0;
	       for (int k = 0; k < a; k++) {
		    if (data[j][k] >= res) tmp++;
	       }
	       if (tmp >= b) count++;
	  }
	  if (count >= d) break;
     }
     cout << res << endl;

     return 0;
}

・B問題
 この問題は言われたことをそのままやります。百の位と十の位の時に数字が9である時に例外処理を施します。問題そのままです。

#include <iostream>
#include <string>
using namespace std;

const string small_str_one[10] = {"nilium", "unium", "bium", "trium", "quadium", "pentium", "hexium", "septium", "octium", "ennium"};
const string small_str_un_one[10] = {"nil", "un", "bi", "tri", "quad", "pent", "hex", "sept", "oct", "enn"};
const string large_str_un_one[10] = {"Nil", "Un", "Bi", "Tri", "Quad", "Pent", "Hex", "Sept", "Oct", "Enn"};
const string small_un_str = "en";
const string large_un_str = "En";
     
int main()
{
     int N;
     cin >> N ;
     string ans;
     int n1 = N % 10;
     N /= 10;
     int n2 = N % 10;
     N /= 10;
     int n3 = N % 10;

     if (n3 == 9) {
	  if (n2 == 0 || n2 == 1) {
	       ans += large_un_str;
	  } else {
	       ans += large_str_un_one[9];
	  }
     } else {
	  ans += large_str_un_one[n3];
     }

     if (n2 == 9) {
	  if (n1 == 0 || n2 == 1) {
	       ans += small_un_str;
	  } else {
	       ans += small_str_un_one[9];
	  }
     } else {
	  ans += small_str_un_one[n2];
     }

     ans += small_str_one[n1];

     cout << ans << endl;
     
	       

     return 0;
}

・C問題
 この問題は答えが26個しか存在しないと分かっているので、そのことを利用してmapで辞書化しておきます。道案内の質問に対してキー(A~Z)を使って座標を引き出し、引き出せない場合は"NA"を返します。

#include <iostream>
#include <map>
#include <string>
#define MAX 1000
using namespace std;

typedef pair<int,int> P;
typedef map<int,P> M;

int main()
{
     M s;
     int n, m, q;
     cin >> n >> m >> q;
     string str[MAX];
     for (int i = 0; i < n; i++) {
	  cin >> str[i];
     }
     for (int i = 0; i < n; i++) {
	  for (int j = 0; j < m; j++) {
	       if (str[i][j] != '*') s[str[i][j] - 'A'] = P(i + 1,j + 1);
	  }
     }
     for (int i = 0; i < q; i++) {
	  char que;
	  cin >> que;
	  P p = s[que - 'A'];
       if (p.first && p.second) {
	    cout << p.first << " " << p.second << endl;
       } else {
          cout << "NA" << endl;
        }
     }
	  

     return 0;
}

今回はD問題以降のアルゴリズムとデータ構造が必要になる問題が解けなかったので、まだまだ競技プログラミングの入門レベルを超えられていない気がします。