盆栽エンジニアリング日記

勉強したことをまとめるブログ

ABC168自分なりのまとめ

A- ∴ (Therefore)

下一桁で条件分岐
もっと賢いやり方がありそうだけど、、、

//競技プログラミング用のテンプレート
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <string>
#include <math.h>
#include <stack>
#include <limits>

#define rep(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define repr(i, n) for(int i = n - 1; i >= 0; i--)

using namespace std;
//エイリアス
using ll = long long int;
using p = pair<int, int>;
using pl = pair<ll, ll>;
using v = vector<int>;
using vd = vector<double>;
using vs = vector<string>;
using vl = vector<ll>;

//定数
const int intmax = numeric_limits<int>::max();
const ll llmax = numeric_limits<ll>::max();
const ll mod = 1e9 + 7;
const double pi = M_PI;

int main()
{
  int n;
  cin >> n;
  string s = to_string(n);
  if(s[s.size() - 1] == '3') {
    cout << "bon" << endl;
  }else if(s[s.size() - 1] == '0') {
    cout << "pon" << endl;
  }else if(s[s.size() - 1] == '1') {
    cout << "pon" << endl;
  }else if(s[s.size() - 1] == '6') {
    cout << "pon" << endl;
  }else if(s[s.size() - 1] == '8') {
    cout << "pon" << endl;
  }else if(s[s.size() - 1] == '2') {
    cout << "hon" << endl;
  }else if(s[s.size() - 1] == '4') {
    cout << "hon" << endl;
  }else if(s[s.size() - 1] == '5') {
    cout << "hon" << endl;
  }else if(s[s.size() - 1] == '7') {
    cout << "hon" << endl;
  }else if(s[s.size() - 1] == '9') {
    cout << "hon" << endl;
  }
}

B-... (Triple Dots)

長さ判定して、あとは適当に

//競技プログラミング用のテンプレート
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <string>
#include <math.h>
#include <stack>
#include <limits>

#define rep(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define repr(i, n) for(int i = n - 1; i >= 0; i--)

using namespace std;
//エイリアス
using ll = long long int;
using p = pair<int, int>;
using pl = pair<ll, ll>;
using v = vector<int>;
using vd = vector<double>;
using vs = vector<string>;
using vl = vector<ll>;

//定数
const int intmax = numeric_limits<int>::max();
const ll llmax = numeric_limits<ll>::max();
const ll mod = 1e9 + 7;
const double pi = M_PI;

int main()
{
  int k;
  cin >> k;
  string s;
  cin >> s;
  if (s.size() <= k) {
    cout << s << endl;
  }else{
    cout << s.substr(0, k) << "..." << endl;
  }
}

C- : (Colon)

悪夢のようなC問題
デジタル時計になれすぎたせいで、分針が動くと時針が動くことに気づけなくて解けなかった
それ以外は適当に三角関数を使って解けばいいです
余弦定理を知っていたらそれが一番楽

//競技プログラミング用のテンプレート
#include <iomanip>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <string>
#include <math.h>
#include <stack>
#include <limits>

#define rep(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define repr(i, n) for(int i = n - 1; i >= 0; i--)

using namespace std;
//エイリアス
using ll = long long int;
using p = pair<int, int>;
using pl = pair<ll, ll>;
using v = vector<int>;
using vd = vector<double>;
using vs = vector<string>;
using vl = vector<ll>;

//定数
const int intmax = numeric_limits<int>::max();
const ll llmax = numeric_limits<ll>::max();
const ll mod = 1e9 + 7;
const double pi = M_PI;

int main()
{
  int a, b, h, m;
  cin >> a >> b >> h >> m;
  double aarg = 30 * h + 0.5 * m;
  double barg = 6 * m;
  double x = aarg - barg;
  double arg = (double)  (x) * pi / 180.0;
  double result = sqrt(a * a + b * b - 2 * a * b * cos(arg));
  cout << fixed;
  cout << setprecision(9) << result << endl;
}

D- .. (Double Dots)

これが本当に400点問題なのかと思うくらい簡単だった。
辺に重みが無いため幅優先探索で始点からの最短経路は全ノードについて求まります。
あとは、幅優先木の親に当たるノードの番号を各ノードについて覚えていけば良いです。
引っ掛けとして、できない場合は-1を出力するように言われていますが、非連結な要素がないため
上の解放で構成できない場合はありません。

//競技プログラミング用のテンプレート
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <string>
#include <math.h>
#include <stack>
#include <limits>

#define rep(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define repr(i, n) for(int i = n - 1; i >= 0; i--)

using namespace std;
//エイリアス
using ll = long long int;
using p = pair<int, int>;
using pl = pair<ll, ll>;
using v = vector<int>;
using vd = vector<double>;
using vs = vector<string>;
using vl = vector<ll>;

//定数
const int intmax = numeric_limits<int>::max();
const ll llmax = numeric_limits<ll>::max();
const ll mod = 1e9 + 7;
const double pi = M_PI;

int main()
{
  int n, m;
  cin >> n >> m;
  vector<vector<int>> graph(n, vector<int>());
  rep(i, m) {
    int a, b; 
    cin >> a >> b;
    graph[a - 1].push_back(b - 1);
    graph[b - 1].push_back(a - 1);
  }

  v parents(n, -1);

  auto bfs = [&](){
    queue<int> q;
    vector<bool> flag(n, false);
    q.push(0);
    flag[0] = true;
    while(!q.empty()) {
      int cur = q.front();
      q.pop();
      for(int i = 0; i < graph[cur].size(); i++) {
        int next = graph[cur][i];
        if(flag[next]) continue;
        q.push(next);
        flag[next] = true;
        parents[next] = cur;
      }
    }
  };
  bfs();
  cout << "Yes" << endl;
  rep(i, n - 1) cout << parents[i + 1] + 1 << endl;
}

E-

//競技プログラミング用のテンプレート
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <string>
#include <math.h>
#include <stack>
#include <limits>

#define rep(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define repr(i, n) for(int i = n - 1; i >= 0; i--)

using namespace std;
//エイリアス
using ll = long long int;
using p = pair<int, int>;
using pl = pair<ll, ll>;
using v = vector<int>;
using vd = vector<double>;
using vs = vector<string>;
using vl = vector<ll>;

//定数
const int intmax = numeric_limits<int>::max();
const ll llmax = numeric_limits<ll>::max();
const ll mod = 1e9 + 7;
const double pi = M_PI;

int main()
{
}