プニプニの新卒就活記録

就職活動が終わりました

どこにいくの?

具体的な社名はまだ公表しませんが,IT企業様です.職種はエンジニアです(分野未定).

就活に向けてやったこと

  • 逆求人イベントへの参加

逆求人イベント....このイベントがなければ今私は内定を持っていなかったと思います.有名企業や自分の知らない業界,企業を知るいい機会であったと思います.逆求人イベントでは1日で複数の企業との面談を行うことができ,面談の冒頭で自己紹介をする時間があります.私は修士課程の学生なので,自分の行っている研究分野に関して一般の方が聞いても概要がある程度把握できるような説明を心掛けました.分かりやすかったという良いフィードバックをいただけたので準備してよかったと思いましたし,その後の選考でも分かりやすく伝える点で良い評価をいただけました.開発周りも自分が取り組んだことについて背伸びせずありのままを伝える準備をしました.背伸びすると墓穴を掘る可能性があるためです.

受けた企業とその選考過程(社名のイニシャルと実際の社名は一切関係ないです)

研究内容やスキルセット,入社してやりたいこと,キャリアパス等を中心に聞かれ,志望動機はあまり聞かれなかった気がします.どの面接も「会社で活躍できそうかな?」や「社風に合う人かな?」というようなマッチ度を見ていたような気がします.新卒なので,研究や開発について「なぜ取り組んだのか」や「大変だったこと,どう乗り越えたか」のような動機やモチベーション,思考プロセスを深掘られた気がします.少なくとも私が受けた企業は「○○技術ができます」だけで面接を通過できるようなものはなかったです.面接の雰囲気は企業によって違い,質問ごとにぶつ切りになる面接もあれば,会話のように進む面接もありました.

以下に受けた企業と選考過程を示します.なお,上記の通り,社名のイニシャルと実際の社名に関係性は一切ないので予めご了承ください.

  • A社

最初に受けた企業です.逆求人イベントで知りました.事業内容が面白そうだなぁと思って面接練習も兼ねて選考を受けました.案の定1次面接で落ちました(それはそう).面接の雰囲気とどういった質問が聞かれるのかというのをここで情報収集した感じです.スキル面は評価されましたが,ご察しの通り,入社してやりたいこと等が明確に言語化できていなかったことが落ちた原因っぽいです.あくまで推測ですが.

  • B社

次に受けた企業です.ES→コーディング試験→1次面接→2次面接(お祈り)でした.スキルや向上心を1次面接で評価してもらったのですが,2次面接でよくわからん質問をされ,納得のいく回答ができなかったことが原因です.面接官との相性も悪かったなぁと思います.まぁ仕方ないですが切り替えて次の選考に移りました.

  • C社

内定をいただいた企業です.ES→コーディング試験→1次面接→2次面接→最終面接(内定)でした.コーディング試験は正直上振れを引きました.偶然過去に類題を解いたことがあったことによる上振れです.全完できたときは手が震えました(笑).面接では研究内容や今までの人生で最もつらかったことなど企業とのマッチ度や人物像を見る質問が多かった印象です.包み隠さずに正直に答えました.面接の手ごたえは全くなかったのですが,気づいたら内定までたどり着いていました.素直に答えたことが良かったのかもしれません.C社は行きたい企業だったので内定は比較的早い段階で承諾しました.

  • D社(番外編)

ES→コーディング(お祈り)でした.コーディング試験全問正解にもかかわらずお祈りをもらいました.こういうこともあるのかと知るいい機会になりました.

他にも受けた企業はありますが,執筆量が多くなるため,ここまでにしておきます.もし知りたい方がいらっしゃいましたら,プニプニまでDM等をお送りください.

感想

以前就活とお見合いは同じ??みたいなことを聞いたことがあったような気がしますが,実際に就活をする中で学生と企業のマッチ度合いはやはり大事なのかなぁと感じました.面接の中で人物像の深堀りをしてきたのもミスマッチを防ぐためなのかもしれません.就活における正解は正直なところ分かりません.入社後に「合わなかった」と後悔する可能性が0とは言い切れません.ですが,私は自身のやりたいことが実現できること,そして私自身の人柄を受け入れくださったC社にお世話になることになりましたので,私としては納得のいく形で就職活動を終えることができたと考えております.

終わりに

就活していると研究に集中できなかったので,これから研究を頑張ります.なお,この文章はお酒を飲みながら書いています.拙い文章で読みにくい部分もあったかと思いますが,ここまでお付き合いいただきありがとうございました.また,競プロ等活動していきますので,今度とも何卒宜しくお願い致します.

ABC166 E his Message Will Self-Destruct in 5s

ABC166 E his Message Will Self-Destruct in 5s

問題概要

整数[$ N]
ある整数列[$ A]が与えられる

 abs(j-i) = A_{i}+A_{j}となる i,j (i < j)を求める

考察

  • 式変形すると見えてくる
  • 見えてしまえばあとは実装するだけの状態に落とし込める

ソースコード

#include<algorithm>
#include<bitset>
#include<cassert>
#include<cfloat>
#include<climits>
#include<cmath>
#include<deque>
#include<functional>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<array>
#include<set>
#include<stack>
#include<string>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>

using namespace std;


const int INF = 1e9 + 7;
constexpr ll MOD = 1e9 + 7;


/***********************************************************************************/


int main() {

	cin.tie(0);
	ios::sync_with_stdio(false);
	cout << fixed << setprecision(10);

	ll N;
	cin >> N;
	vector<ll> A(N);
	map<ll,ll> L,R;
	for(int i = 0;i < N;i++){
		cin >> A[i];
		L[i+A[i]]++;
		R[i-A[i]]++;
	}
	ll ans = 0;

	for(auto itr:L){
		ans += itr.second*R[itr.first];
	}
	cout << ans << endl;
	
	return 0;
}

ABC166 E his Message Will Self-Destruct in 5s

ABC166 E his Message Will Self-Destruct in 5s

問題概要

整数[$ N]
ある整数列[$ A]が与えられる

 abs(j-i) = A_{i}+A_{j}となる i,j (i < j)を求める

考察

  • 式変形すると見えてくる
  • 見えてしまえばあとは実装するだけの状態に落とし込める

ソースコード

#include<algorithm>
#include<bitset>
#include<cassert>
#include<cfloat>
#include<climits>
#include<cmath>
#include<deque>
#include<functional>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<array>
#include<set>
#include<stack>
#include<string>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>

using namespace std;


const int INF = 1e9 + 7;
constexpr ll MOD = 1e9 + 7;


/***********************************************************************************/


int main() {

	cin.tie(0);
	ios::sync_with_stdio(false);
	cout << fixed << setprecision(10);

	ll N;
	cin >> N;
	vector<ll> A(N);
	map<ll,ll> L,R;
	for(int i = 0;i < N;i++){
		cin >> A[i];
		L[i+A[i]]++;
		R[i-A[i]]++;
	}
	ll ans = 0;

	for(auto itr:L){
		ans += itr.second*R[itr.first];
	}
	cout << ans << endl;
	
	return 0;
}

キーエンスコン2020 D Swap and Flip

キーエンスコン2020 D Swap and Flip

問題概要

リンク参照

考察

  • 制約がbitDPしてほしそうな制約をしている
  • :i番目の値が動いた時,表と裏どちらになるのか見てあげると:i番目から:j番目に動くときに:i-jが奇数なら裏,偶数なら表を使うことになる
  • dp[msk][lst]:既に単調増加になっているものの状態がmskで最後に使った数字がlstであるときの操作回数する
  • mskの立っているbit数が:k個の時,既に小さい方から:k番目の数字は確定しているので,次の数字は:k+1番目の数字になる

ソースコード

#include<algorithm>
#include<bitset>
#include<cassert>
#include<cfloat>
#include<climits>
#include<cmath>
#include<deque>
#include<functional>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<array>
#include<set>
#include<stack>
#include<string>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>

using namespace std;

typedef long long int ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;


template<typename T>
vector<T> make_v(size_t a) { return vector<T>(a); }
template<typename T, typename... Ts>
auto make_v(size_t a, Ts... ts) {
	return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}
template<typename T, typename V>
typename enable_if<is_class<T>::value == 0>::type
fill_v(T& t, const V& v) { t = v; }
template<typename T, typename V>
typename enable_if<is_class<T>::value != 0>::type
fill_v(T& t, const V& v) {
	for (auto& e : t) fill_v(e, v);
}


template <typename T>
bool chmax(T & a, const T & b) {
	if (a < b) {
		a = b;
		return true;
	}
	return false;
}
template <typename T>
bool chmin(T & a, const T & b) {
	if (a > b) {
		a = b;
		return true;
	}
	return false;
}


const int INF = 1e9 + 7;
constexpr ll MOD = 1e9 + 7;

/******************************************************************************************/


int dp[(1<<18)][55];

int main() {

	cin.tie(0);
	ios::sync_with_stdio(false);
	cout << fixed << setprecision(10);

    int N;
    cin >> N;
    auto AB = make_v<int>(2,N);
    for(int i = 0;i < 2;i++){
        for(int j = 0;j < N;j++){
            cin >> AB[i][j];
        }
    }
    
    for(int i = 0;i < (1<<18);i++){
        for(int j = 0;j < 55;j++){
            dp[i][j] = INF;
        }
    }

    dp[0][0] = 0;
    for(int msk = 0;msk < (1<<N);msk++){

        for(int lst=0;lst <= 50;lst++){
            if(dp[msk][lst]==INF)continue;

            int done = 0;
            for(int i= 0;i < N;i++){
                if((msk>>i)&1)done++;
            }
            for(int i = 0;i < N;i++){

                if((msk>>i)&1)continue;

                int nxt = AB[abs(done-i)%2][i];

                if(nxt < lst)continue;

                int c = 0;
                for(int j = 0;j < i;j++){
                    if(!((msk>>j)&1))c++;
                }
                chmin(dp[msk|(1<<i)][nxt],dp[msk][lst]+c);
            }
        }
    }

    int ans = INF;
    for(int i = 0;i < 51;i++){
        chmin(ans,dp[(1<<N)-1][i]);
    }
    if(ans == INF)ans=-1;
    cout << ans << endl;





	return 0;
}







ABC159 E Dividing Chocolate

ABC159 E Dividing Chocolate

問題概要

リンク参照

考察

  • どう分ければいいのか分からん
  • Hが小さいので怪しい...なんだこれ...
  • 1行だけの場合を考えてみると貪欲っぽく見える
  • これをH行の場合に拡張すればいいのか....
  • Hが小さいし,横を決め打ちすればあとは同じに見えたので実装してみると通りました笑
  • バグを埋め込んだので反省

ソースコード

#include<algorithm>
#include<bitset>
#include<cassert>
#include<cfloat>
#include<climits>
#include<cmath>
#include<deque>
#include<functional>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>

using namespace std;

typedef long long int ll;

const int INF = 1e9 + 7;
const ll MOD = 1e9 + 7;

/******************************************************************************************/

char mp[15][1005];


int main() {

	cin.tie(0);
	ios::sync_with_stdio(false);
	cout << fixed << setprecision(10);

	int h, w, k;
	cin >> h >> w >> k;

	for (int i = 0; i < h; i++)
	{
		for (int j = 0; j < w; j++)
		{
			cin >> mp[i][j];
		}
	}

	int ans = INF;
	for (int mask = 0; mask < (1 << (h - 1)); mask++)
	{
		vector<vector<int> > comp;
		vector<int> hoge(w + 10, 0);
		int cnt = 0;
		bool can = true;

		for (int i = 0; i < h; i++)
		{
			for (int j = 0; j < w; j++)
			{
				hoge[j + 1] += mp[i][j] - '0';
			}

			if ((mask >> i) & 1) {
				//ここで線が入る
				for (int j = 0; j <= w; j++)
				{
					if (hoge[j] > k) {
						can = false;
						break;
					}
				}

				if (!can)break;
				comp.push_back(hoge);
				fill_v(hoge, 0);
				cnt++;
			}
		}

		for (int j = 0; j <= w; j++)
		{
			if (hoge[j] > k) {
				can = false;
				break;
			}
		}
		if (!can)continue;
		
		comp.push_back(hoge);


		//あとは左から貪欲
		for (int j = 0; j < w; j++)
		{
			bool ok = true;
			for (int i = 0; i < comp.size(); i++)
			{
				ok &= (comp[i][j] + comp[i][j + 1] <= k);
			}


			if (ok) {
				for (int i = 0; i < comp.size(); i++)
				{
					comp[i][j + 1] += comp[i][j];
				}
			}
			else
			{
				cnt++;
			}
		}
		ans = min(ans, cnt);
	}


	cout << ans << endl;

	return 0;
}


ABC160 E Red and Green Apples

ABC160 E Red and Green Apples

問題概要

リンク参照

考察

  • 無色のものがないなら,赤を大きいほうからX個,緑を大きいほうからY個選べば良さそう.
  • 無色の扱いをどうしよう...(´・ω・`)
  • 赤にも緑にもなるのなら,赤を大きいほうからX個,緑を大きいほうからY個選んだあとで,無色リンゴよりも美味しさが小さいものを除いて無色リンゴを着色して入れ替えれば条件を満たしたまま最大化できそう
  • 貪欲....

ソースコード

#include<algorithm>
#include<bitset>
#include<cassert>
#include<cfloat>
#include<climits>
#include<cmath>
#include<deque>
#include<functional>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>

using namespace std;

typedef long long int ll;

/******************************************************************************************/

int main() {

	cin.tie(0);
	ios::sync_with_stdio(false);
	cout << fixed << setprecision(10);

	ll x, y, a, b, c;
	cin >> x >> y >> a >> b >> c;
	vector<ll> p(a), q(b), r(c);

	for (int i = 0; i < a; i++)
	{
		cin >> p[i];
	}

	for (int i = 0; i < b; i++)
	{
		cin >> q[i];
	}

	for (int i = 0; i < c; i++)
	{
		cin >> r[i];
	}

	sort(p.rbegin(), p.rend());
	sort(q.rbegin(), q.rend());
	sort(r.rbegin(), r.rend());

	priority_queue<ll> M;

	for (int i = 0; i < x; i++)
	{
		M.push(p[i]);
	}

	for (int i = 0; i < y; i++)
	{
		M.push(q[i]);
	}

	for (int i = 0; i < c; i++)
	{
		M.push(r[i]);
	}

	ll ans = 0;

	ll cnt = 0;
	while (!M.empty()) {

		ans += M.top();
		M.pop();
		cnt++;
		if (cnt == x + y) {
			break;
		}

	}
	cout << ans << endl;

	return 0;

}

2020/03/06の精進