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

PCK2013 予選参加記

お久しぶりです。

参加記の前に前回の記事から何をしていたかちょこっと。



5月から8月までソフトウェアの制作をしていました。

とある大会に向けてです。

あと、受験で必要な書類や資料の作成、勉強もしてました。

ソフトウェアについては大会類全部終わったら詳細書きますね。



ついでに今日はPCKでした。

ペアは後輩で、正直一人で解いてました...。



結果
○○○○○○△△×

みたいな感じで、7はTLE,8はバグ取れなかったのでちょっと残念。

ただし毎年地域の枠があるので、なんとか本選行けそうな様子。



問題について書きますが、8,9は再挑戦するので省略。

1問目

問題読んでない。後輩くんがやってくれたらしい。

#include<iostream>

using namespace std;

int main()
{
	int a , b;

	for (int i = 0; i < 7; i++){
		int ans = 0;

		cin >> a >> b;
		ans += a - b;

		cout << ans << endl;
	}


	return 0;
}

2問目

これも後輩くんが(ry

#include<iostream>

using namespace std;

int h[5] =	{0 , 6000 , 4000 , 3000 , 2000};


int main(void)
{
	int t , n;

	for (int i = 0; i < 4; i++){
		int ans = 0;
		
		cin >> t >> n;
		ans = h[t] * n;

		cout << ans << endl;
	}

	return 0;
}

3問目

解法書いた紙投げて実装してもらった。

5以上,2以上でない場合に割引したときの価格と原価を比べるだけ。

#include<iostream>
#include<algorithm>

using namespace std;


int main()
{

	int n = 0;

	cin >> n;

	for (int i = 0; i < n; i++){
		int x , y , b, p;

		cin >> x >> y >> b >> p;

		int normal = 0 , max = 0;

		normal = x * b + y * p;
		max = x * b + y * p;

		if (b >= 5 && p >= 2){
			normal = (double)normal * 0.8;
			cout << normal << endl;
			continue;
		}

		if (b < 5){
			max += x * (5 - b);
		}
		if (p < 2){
			max += y * (2 - p);
		}
		max = (double)max * 0.8;

		max = std::min(normal , max);

		cout << max << endl;
	}

	return 0;
}

4問目

これも解放投げて実装してもらった。

(N種類のカプセルから0個のカプセルを含めない種類の数)+1 で求まる。

ただ、2以上の数字が無いときは場合分けが必要。

#include<iostream>

using namespace std;

int main()
{
	int n;



	while (cin >> n , n){
		int cnt = 0;
		bool flag = false;
		for (int i = 0; i < n; i++){
			int k = 0;
		
			cin >> k;
			if (k){
				cnt++;
			}
			if (k > 1){
				flag = true;
			}
		}

		if (cnt && flag){
			cout << cnt + 1 << endl;
		}else{
			cout << "NA" << endl;
		}
	}

	return 0;
}

5問目

さすがにそろそろやらなきゃ後輩に申し訳なかったのでやった。

シミュレートするだけ。

思えばこのコードが半年ぶりに書いた競技のコードだった。。。

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

int main()
{
	int m[11];
	int n;

	while(cin >> n,n){
		for(int i=0;i<11;i++){
			m[i]=0;
		}
		int ba=0,u=0;
		string str;
		cin >> str;

		for(int i=0;i<str.size();i++){
			if(str[i]=='S'){
				m[u]++;
				ba+=m[u];
				m[u]=0;
			}else if(str[i]=='L'){
				m[u]++;
				m[u]+=ba;
				ba=0;
			}else if(str[i]=='M'){
				m[u]++;
			}
			u++;
			if(u==n){
				u=0;
			}
		}

		sort(m,m+n);
		for(int i=0;i<n;i++){
			cout << m[i] << " ";
		}
		cout << ba << endl;
	}

	return 0;
}

6問目

解いた。

N→A→Cの順に使っていけばいいかなーって思った。

オーダーとか特に考えてない。

#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
	int n;
	cin >> n;

	for(int i=0;i<n;i++){
		int c=0,a=0,n=0,cnt=0;
		cin >> c >> a >> n;


		while(n>=1 && a>=1 && c>=1){
			n--;a--;c--;
			cnt++;
		}

		while(a>=1 && c>=2){
			a--;c-=2;
			cnt++;
		}

		while(c>=3){
			c-=3;
			cnt++;
		}

		cout << cnt << endl;
	}

	return 0;
}

7問目

このコードだとTLEします。

解法聞いててセグ木とかsetとか頭いいなーって思った(こなみ)

setでやろうと思ったけど仕様が不鮮明だったので愚直にやって撃沈。

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
#define mp make_pair

using namespace std;

typedef pair<int,int> Pii;

int t[100001];
int p[100001];

int main()
{
	int n,r,l;
	cin >> n >> r >> l;

	vector<pair<int,pair<int,int> > > v;

	for(int i=0;i<r;i++){
		int a,b,c;
		cin >> a >> b >> c;
		v.push_back(make_pair(a-1,make_pair(b,c)));
	}


	vector<Pii> vk;
	int now=0;

	for(int i=0;i<n;i++){
		vk.push_back(mp(i,0));
	}

	for(int i=0;i<v.size();i++){
		t[vk.front().first]+=v[i].second.first-now;
		now=v[i].second.first;

		Pii y;y=mp(v[i].first,p[v[i].first]+v[i].second.second);
		p[v[i].first]+=v[i].second.second;

		

		vector<Pii>::iterator it=vk.begin();

		while(it!=vk.end()){
			if(it->first==v[i].first){
				vk.erase(it);
				break;
			}
			it++;
		}

		it=vk.begin();
		while(y.second<it->second || (y.second==it->second && y.first>=it->first)){
			it++;
			if(it==vk.end())break;
		}
		if(it==vk.end())vk.push_back(y);
		else vk.insert(it,y);
	}

	t[vk.front().first]+=l-now;

	int ans=0;
	for(int i=1;i<n;i++){
		if(t[ans]<=t[i]){
			ans=i;
		}
	}

	cout << ans+1 << endl;
	return 0;
}
総括

VC++クソだ。

PCKでVC++使ってる人はほんとにやめたほうが良い。

JOIとかCEで死ぬかもしれないから・・・。

今回の1WAはVC++だと通るコードがあっち(サーバー)だとCEになったのが原因でした。



ペアについては、まぁ元々期待していなかった。

ICPCとか、自分よりすごい人と組んで影響受けたいなぁ。

入試受かって、10月の大会の本選通らなかったら競技また復帰しますね。



明日9/15,16に制作したソフトウェアのプレゼンしに行くので、とりあえずここまで。

PCK2013予選お疲れ様でした!