夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

精進だから精進なんだよ

3069

結局蟻本

#include <cstdio>
#include <algorithm>
using namespace std;
int main() {
	int R, n;
	while (scanf("%d%d", &R, &n)) {
		if (R == -1 && n == -1) break;
		int army[n];
		for (int i=0; i<n; i++) scanf("%d", &army[i]);
		sort(army, army+n);
		int res = 0, i = 0;
		while (i < n) {
			int s = army[i++];
			while (i<n&&army[i]<=s+R) i++;
			int p = army[i-1];
			while (i<n&&army[i]<=p+R) i++;
			res++;
		}
		printf("%d\n", res);
	}
}

3253

蟻本。long long注意

#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <functional>
using namespace std;
typedef long long ll;
int main() {
	int n; scanf("%d", &n);
	int f[n];
	for (int i=0; i<n; i++) scanf("%d", &f[i]);
	ll res = 0;
	priority_queue<int, vector<int>, greater<int> > tree;
	for (int i=0; i<n; i++) tree.push(f[i]);
	while (tree.size() > 1) {
		int fir = tree.top(); tree.pop();
		int sec = tree.top(); tree.pop();
		int sum = fir + sec;
		res += sum;
		tree.push(sum);
	}
	printf("%lld\n", res);
}

2431

蟻本コードも自分で書いたコードも通らない緊急事態
コメントアウトしてないのが正解。

// #include <cstdio>
// #include <vector>
// #include <queue>
// #include <algorithm>
// using namespace std;
// struct dt {
	// int a, b;
// };
// class dtComp {
	// public:
		// bool operator() (const dt& x, const dt& y) {
			// return x.a < y.b;
		// }
// };
// int main() {
	// int n, l, p; scanf("%d", &n);
	// dt dts[n];
	// for (int i=n-1; i>=0; i--) scanf("%d%d", &dts[i].a, &dts[i].b);
	// scanf("%d%d", &l, &p);
	// for (int i=0; i<n; i++) dts[i].a = l - dts[i].a;
	// sort(dts, dts+n, dtComp());
	// int npos = 0, res = 0, i = 0;
	// priority_queue<int> que;
	// while (1) {
		// for (;i<n;i++) {
			// if (dts[i].a > npos + p) break;
			// que.push(dts[i].b);
		// }
		// npos += p;
		// if (npos >= l) break;
		// else if (que.empty()) break;
		// p = que.top(); que.pop();
		// res++;
	// }
	// if (npos < l) printf("-1\n");
	// else printf("%d\n", res);
// }
// int main() {
	// int n, l, p; scanf("%d", &n);
	// dt dts[n+1];
	// for (int i=n-1; i>=0; i--) scanf("%d%d", &dts[i].a, &dts[i].b);
	// scanf("%d%d", &l, &p);
	// for (int i=0; i<n; i++) dts[i].a = l - dts[i].a;
	// int npos = 0, res = 0, tank = p;
	// dts[n].a = l; dts[n].b = 0;
	// priority_queue<int> que;
	// for (int i=0; i<n+1; i++) {
		// int d = dts[i].a - npos;
		// while (tank - d < 0) {
			// if (que.empty()) {
				// puts("-1");
				// return 0;
			// }
			// tank += que.top(); que.pop();
			// res++;
		// }
		// tank -= d;
		// npos = dts[i].a;
		// que.push(dts[i].b);
	// }
	// printf("%d\n", res);
// }
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int main()
{
	int N;
	vector<pair<int, int> > v;
	scanf("%d\n", &N);
	for(int i = 0; i < N; i++){
		int x, y;
		scanf("%d %d\n", &x, &y);
		v.push_back(make_pair(x, y));
	}
	int L, P;
	scanf("%d %d\n", &L, &P);
	sort(v.begin(), v.end());
	vector<pair<int, int> >::reverse_iterator rit = v.rbegin();
	priority_queue<int> pq;
	int cnt = 0;
	while(L){
		if(L == (*rit).first){
			pq.push((*rit).second);
			rit++;
		}
		if(P == 0){
			if(pq.empty()){
				cnt = -1;
				break;
			}
			P += pq.top();
			pq.pop();
			cnt++;
		}
		P--;L--;
	}
	printf("%d\n", cnt);
	return 0;
}

3047

USACO Bronze part1
leap yearの数は端折らずちゃんと数えて挙げなきゃね

#include <cstdio>

typedef long long ll;
int mon[] = {31,28,31,30,31,30,31,31,30,31,30,31};
const char* day[] = {"monday","tuesday","wednesday",
"thursday","friday","saturday","sunday"};

bool isleap(int y) {
	if (y % 400 == 0) return true;
	else if (y % 100 == 0) return false;
	else if (y % 4 == 0) return true;
	else return false;
}

int main() {
	int y, m, d;
	scanf("%d%d%d", &y, &m, &d);
	int normal = 0, leap;
	for (int i=0; i<12; i++) normal += mon[i];
	leap = normal + 1;
	int cnt = 0;
	for (int i=1800; i<y; i++) if (isleap(i)) cnt++;
	ll dist = cnt*leap+(y-1800-cnt)*normal;
	for (int i=0; i<m-1; i++) {
		if (i == 1&&isleap(y)) {
			dist += mon[i] + 1;
		} else {
			dist += mon[i];
		}
	}
	dist += d;
	int res = (1 + dist % 7) % 7;
	printf("%s\n", day[res]);
}

3048

USACO Bronze part2
例外処理として素数に1を加えなきゃならない・・・

#include <cstdio>
#include <algorithm>
using namespace std;

int main() {
	int isprime[20001],psize=0;
	fill(isprime, isprime+20001, 1);
	isprime[0]=isprime[1]=0;
	for (int i=2; i<20001; i++) {
		if (isprime[i]) {
			for (int j=i+i; j<20001; j+=i) isprime[j]=0;
			psize++;
		}
	}
	int prime[++psize], npos=1;
	prime[0]=1;
	for (int i=2; i<20001; i++) {
		if (isprime[i]) prime[npos++]=i;
	}
	int n; scanf("%d",&n);
	int num[n],m=0;
	for (int i=0; i<n; i++) {
		scanf("%d",&num[i]);
		m=max(m,num[i]);
	}
	int p;
	for (p=0; p<psize; p++) if (prime[p]>=m) break;
	int res = 0;
	for (;p>=0;p--) {
		for (int i=0; i<n; i++) if (num[i]%prime[p]==0) {
			res=num[i];
			break;
		}
		if (res) break;
	}
	printf("%d\n",res);
}