Particle

競技プログラミングについての雑記

第11回JOI

一昨日の

1〜3はC++、6はRuby

1.ランチ
3項演算子は知ってたけど、minはさっき知った。

#include <iostream>
using namespace std;

int main(){
	int c[5];
	int i;
	for(i=0; i<5; i++){
		cin>>c[i];
	}
	for(i=1; i<3; i++){
		if(c[0]>c[i])c[0]=c[i];//c[0]=min(c[0],c[i]);
	}
	if(c[3]>c[4])c[3]=c[4];//c[3]=min(c[3],c[4]);
	cout<<c[0]+c[3]-50;

	return 0;
}

2.サッカー
点数を計算してソートした。ifが多い理由は上参照

#include <functional>
#include <iostream>
#include <vector>
using namespace std;

int main(){
	int N,i,j;
	cin>>N;
	vector<int> T(N,0);
	int Ns=N*(N-1)/2;
	vector<vector<int> > P(Ns,vector<int>(4));
	for(i=0; i<Ns; i++){
		for(j=0;j<4;j++){
			cin>>P[i][j];
		}
	}
	for(i=0; i<Ns; i++){
		if(P[i][2]>P[i][3])T[P[i][0]-1]+=3;
		if(P[i][2]<P[i][3])T[P[i][1]-1]+=3;
		if(P[i][2]==P[i][3]){
			T[P[i][0]-1]++;
			T[P[i][1]-1]++;
		}
	}
	vector<int> S(T);
	sort(S.begin(),S.end(),greater<int>());
	for(i=0;i<N; i++){
		for(j=0;j<N;j++){
			if(T[i]==S[j]){
				T[i]=j+1;
				break;
			}
		}
	}
	
	for(i=0; i<N; i++){
		cout<<T[i]<<endl;
	}
	
	return 0;
}

3.最高のピザ
ソートして、最高のトッピングを試していく。誤差が怖かったから掛け算したけど、恐らく意味がない。

#include <iostream>
#include <functional>
#include <vector>
using namespace std;

int main(){
	int N;
	int i,j,k;
	int A,B;
	int C;
	cin>>N>>A>>B>>C;
	vector<int>D(N);
	for(i=0; i<N; i++) cin>>D[i];
	sort(D.begin(),D.end(),greater<int>());
	int cal=C;
	int cal2=C;
	int cost=A;
	int cost2=A;
	
	for(i=0; i<N; i++){
		cal2+=D[i];
		cost2+=B;
		if(cal2*cost<cal*cost2) break;
		cal=cal2;
		cost=cost2;
	}
	cout<<cal/cost;
	
	return 0;
}

4.パスタ
自分のコードは間違って消しちゃった。
2時間以上デバッグしてたけど、結局解けなかった。論理的に正しそうだったけど、たぶん思い込み。

5.イルミネーション
解いてない。あとで解く予定。
外:-1、未確定:0、建物、1、建物の中確定:2
で一回り大きく作ってDFSすれば解けたかもしれない。建物全てで外といくつの辺で隣接してるかを調べて、たぶん行ける。

6.ジグザグ数
解いてないけど、終了後に、総当たりで入力1だけ処理できるスクリプトを書いた。間違ってるかもしれない。

s = gets.to_i
t = gets.to_i
d = gets.to_i

ret = 0


for n in s..t do
	fg = n % d
	if fg == 0 then
		if n <= 10 then
			ret += 1
			next
		end
		dif = (n % 10) - ((n / 10) % 10)
		n = n / 10
		dif2 = (n % 10) - ((n / 10) % 10)
		if n < 10 && dif != 0 then
			ret += 1
			next
		end
		while (dif*dif2)<0
			dif = dif2
			n = n / 10
			dif2 = (n % 10) - ((n / 10) % 10)
			if n < 10 && dif2 != 0 then
				ret += 1
				break
			end
		end
	end
end

puts ret%10000