kotonoha_pcg@ぷろこんにっき

ここ(http://kotonoha-pcg.hatenablog.com/)の別館です、競プロの話が殆どです。最近mdモードに変えて一気に使い勝手が変わりました。

JOI Qualifying Open Contest

 たぶん100点です.適当にGoogle Docで作ったものを持ってきています.

JOI Qualifying Open Contest Problem editorial


1

 解説書きます.5つの数値が与えられる.これを,前半4つと後半2つとで分けて,それぞれ降順ソート→前半3つと後半1つを加算して出力.解説などを見ると前半は合計して最も小さい値を引く,などの解法もあった.

以下ソース

#include <bits/stdc++.h>
using namespace std;

#define rep(i,n) for(int i=0;i<n;i++)
#define pb push_back
int main()
{
	int x;
	vector<int> vi;
	rep(i,4){
		cin>>x;
		vi.pb(x);
	}
	int des=0,def=0;
	cin>>des>>def;
	if(des>def){
		des=des;
	}else{
		des=def;
	}
	sort(vi.begin(), vi.end(), greater<int>());
 int ans=0;
	rep(i,3) ans+=vi[i];
	ans+=des;
	cout<<ans<<endl;
	return 0;
}

2

 入力で嵌ったけどそこ以外は何とかなった.バトンの処理がネックになる.バトンは与えられる配列内の生徒が最後まで行ってから次の周回に入るので,ループは

#define rep(i,n) for(int i=0;i<n;i++)
#define REP(a,b,c) for(int a=b;a=c;a++)
REP(i,1,M)
 rep(j,n)

となる.処理の中心部になるゼッケンの交換処理は,std::swap()を使うと簡単に書ける.交換する条件は,a[j]とバトンkの剰余と,a[j+1]とバトンkの剰余において,前者のほうが後者より大きかった際に交換する.

以下ソース

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n,m;
	scanf("%d%d",&n, &m);
	int a[200];
	for(int i-0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(int i-=1;i=m;i++){
		for(int j=0;j<n;j++){
			if(a[j]%k>a[j+1]%k) swap(a[j], a[j+1]);
		}
	}
	for(int i=0;i<n;i++){
		printf("%d",a[i]);
	}
	return 0;
}

3問目以降についてはまだ目を通していないので,そのうち書くか書かないと思います.