ぐってぃのプログラミング日記

競技プログラミングやIT関係の記事を書いていくよ

C - Energy Drink Collector 

問題

atcoder.jp

考察

値段が低いもの順に昇順ソートして、低いものから買える分だけ買った値段を出力すればおーけー。
値段と本数ペアでソートしたいので、vector>を活用する。

実装

#include<iostream>
#include <vector>
#include <algorithm>
#include <map>

#define ll long long

using namespace std;

int main() {
	ll n, m;

	cin >> n >> m;

	vector<pair<ll, ll> > pairs(n);

	for (ll i = 0; i < n; i++) {
		ll a, b;
		cin >> a >> b;
		pairs[i] = make_pair(a, b);
	}

	// firstが小さい順、secondが小さい順にソート
	sort(pairs.begin(), pairs.end());

	ll ans = 0;

	for (int i = 0; i < n; i++)
	{
		if (pairs[i].second < m) {
			m -= pairs[i].second;
			ans += pairs[i].first * pairs[i].second;
		}
		else {
			ans += m * pairs[i].first;
			cout << ans << endl;
			return 0;
		}
	}	
}

とても便利なpair

RUPC2019 Day1参加記

初オンサイトに行ってきた。

立命館の競プロサークルが主催されている立命館大学競技プログラミング合宿に参加してきました。
レート茶色だったり、初めてだったりで躊躇していましたが、けんちょんさんはじめ、強い方々が
一堂に会する場にいけるのは貴重だと思い、参加しました。
Day2,3は急用でいけなくなりましたが色々思うことがあったので、書き記します。

コンテスト前

参加者の平均レートは水色くらいでつよつよな人しかいませんでした。
少し時間があったので、尊敬しているけんちょんさんとprdさんに挨拶しました。
お二人とも柔和な雰囲気で優しさに溢れていました。社会人なっても時間作って
競プロしているのは尊敬して止みません。
けんちょんさんは新しい記事を考案中だそうです。楽しみだなあ。

コンテスト

ぼっち参加だったのでランダムでチーム編成を行い、りあんさんとみかんさんとチームを
組ませていただきました。コンテスト直前に担当する問題分けをチームで話したりしました。
チームで競プロするってなんかいいなって思いました。

問題

A問題

ぼくが担当しました。
簡単な算数でしたが、サンプル3で詰まっちゃいました。
りあんさんが「そのままじゃない?」との神の助言をいただきなんとかACしました。

#include<iostream>
#include<vector>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;

int main() {
	int h, w, a, b;
	cin >> h >> w >> a >> b;
	if (h < a || w < b) {
		cout << h * w << endl;
		return 0;
	}

	int x = (h % a)* w + (w % b) * h - (h % a) * (w % b);

	cout << x << endl;
}
B問題

入力される文字が(T, F)の順序のときのみ、Fに変換。そのほかはTに変換する処理を書けば、OK。
みかんさんがきれいに実装してました。

C問題

頭で考えず、手で動かして実験する問題でした。つよい人は手を動かすのが早い。

シュミレーションすると上の画像みたいになるそうです。
りあんさんが爆速で解いてました。

D~G問題

難しすぎるのでパス。

コンテスト総評

しっかりオンサイトで楽しむには最低水レートは必要だなあとひしひしと
感じました。チームで考察あーだこーだ言ったり、ペアプログラミングしてみたいなあ。
全完して喜んでいるチームを見て青春を感じたので、ぼくもチームで
大会出て活躍したいです。

おわりに

f:id:ymgcmsts60:20190305220546j:plain
にぼおいしかった。

精進するぞ!

AtCoder Beginner Contest 120

A問題

b ÷ aがcより少なければb ÷ a 出力
それ以外ならcで満足するのでcを出力

#include <iostream>
#include <numeric>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iterator>
#include <math.h>
#include <cmath>
#include <set>   
#include <bitset>
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <queue>
#include <boost/math/common_factor_rt.hpp>

#define ll long long
using namespace std;
ll l = 1000000007;

int main()
{
	int a, b, c;
	cin >> a >> b >> c;

	if (c < b / a) {
		cout << c << endl;
	}
	else {
		cout << b / a << endl;
	}
	
}

B問題

AとBを素因数分解して同じ数字を取り出して配列にいれる。
降順に並べて配列のK-1番目を出力すればおけ

考察すぐできたのに実装が重すぎる・・

#include <iostream>
#include <numeric>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iterator>
#include <math.h>
#include <cmath>
#include <set>   
#include <bitset>
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <queue>
#include <boost/math/common_factor_rt.hpp>

#define ll long long
using namespace std;
ll l = 1000000007;
vector<int> a[1000] = {};
vector<int> b[1000] = {};
vector<int> ans[1000] = {};


int main()
{
	int A, B, K;
	cin >> A >> B >> K;

	a->push_back(1);
	b->push_back(1);



	int x = A;
	int y = B;

	for (int i = 2; i <= A; i++) {
		if(A%i == 0) { 
			a->push_back(i);
		}
	}

	for (int i = 2; i <= B; i++) {
		if (B%i == 0) { 
			b->push_back(i);
		}
	}
	
	if (a->size() >= b->size()) {
		for (int i = 0; i < a->size(); i++)
		{
			for (int j = 0; j < b->size(); j++)
			{
				if (a->at(i) == b->at(j)) {
					ans->push_back(a->at(i));
				}
			}
		}
	}
	else {
		for (int i = 0; i < b->size(); i++)
		{
			for (int j = 0; j < a->size(); j++)
			{
				if (b->at(i) == a->at(j)) {
					ans->push_back(b->at(i));
				}
			}
		}
	}
	
	int s = ans->size() - 1;
	sort(ans->begin(), ans->end(), greater<int>());

	cout << ans->at(K - 1) << endl;
}

C問題

01か10の場合どっちを消せばいいのかみたいな判定いるかと思ったけど、
箱をソートしてしまえば最も多く消せる数値がわかる。
出力は赤と青で少ない方の2倍を出力すればおけ
なんだか簡単だし嘘解法な気する。

#include <iostream>
#include <numeric>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iterator>
#include <math.h>
#include <cmath>
#include <set>   
#include <bitset>
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <queue>
#include <boost/math/common_factor_rt.hpp>

#define ll long long
using namespace std;
ll l = 1000000007;
vector<char> s;

int main()
{
	ll z = 0, o = 0;
	string S;
	cin >> S;
	for (ll i = 0; i < S.size(); i++)
	{
		s.push_back(S.at(i));
	}
	for (ll i = 0; i < s.size(); i++)
	{
		if (s.at(i) == '0') {
			z++;
		}
		else {
			o++;
		}
	}
	
	if (z >= o) {
		cout << o * 2 << endl;
	}
	else {
		cout << z * 2 << endl;

	}

}

Dはわからず・・・
C問題安定してきた