Lilliput Steps

小さな一歩から着実に. 数学やプログラミングのことを書きます.

AOJ 0586, 0587, 0588, 0589

JOI ボリュームの残っていた問題.
せっかくなのでコンパイルせずに提出することにしたら悲惨なことになった.


0586
回文素数っぽいものを出力する問題.
$c < 0$ かつ $n > 1$ であれば該当する素数なし. なぜならば, $n > 1$ のとき
$a_0 \times 10^{2n - 1} + a_1 \times 10^{2n - 2} + \cdots + a_1 \times 10^{1} + a_0 \times 10^{0} \equiv 0 ( \mod 11)$

#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;
int n, m;
long long int ans;

char x[16];

bool prime(long long int x)
{
	for (long long int i = 2; i * i <= x; i++){
		if (x % i == 0) return (false);
	}
	return (x != 1);
}

void dfs(int idx)
{
	if (idx == n){
		if (prime(atoll(x))) ans = max(ans, atoll(x));
		return;
	}
	for (int i = '0'; i <= '9'; i++){
		if (idx == 0 && (i != '1' && i != '3' && i != '7' && i != '9')) continue;
		x[idx] = i; x[2 * n - idx] = i;
		dfs(idx + 1);
	}
}

int main()
{	
	scanf("%d %d", &n, &m);
	if (m < 0){
		if (n != 1) for (int i = 0; i < 2 * n; i++) printf("9");
		else printf("11");
		printf("\n");
	}
	else {
		x[2 * n + 1] = 0;
		x[n] = m + '0';
		dfs(0);
		printf("%lld\n", ans);
	}
	return (0);
}

1 WA, 1 CE でした.

0587

加減算をしましょう.

#include <cstdio>

using namespace std;

int main()
{
	int n, m;
	
	scanf("%d %d", &n, &m);
	
	int ans = m;
	
	for (int i = 0; i < n; i++){
		int a, b;
		scanf("%d %d", &a, &b);
		m += (a - b);
		if (m < 0) return (!printf("0\n"));
		else ans = m > ans ? m : ans;
	}
	return (!printf("%d\n", ans));
}

m を出力して1 WA.

0588
四則演算をしましょう.

#include <cstdio>

using namespace std;

int in(void)
{
	int x;
	scanf("%d", &x);
	return (x);
}

int main()
{
	char symbol = '+';
	int ans = 0;
	
	do {
		if (symbol == '+') ans += in();
		if (symbol == '-') ans -= in();
		if (symbol == '*') ans *= in();
		if (symbol == '/') ans /= in();
		scanf(" %c", &symbol);
	} while (symbol != '=');
	
	printf("%d\n", ans);
	
	return (0);
}

symbol のアドレスを参照しなくて1RE, ans でなくsymbol を出力して1 WA...

0589
ソートしましょう.

#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	int n;
	
	scanf("%d", &n);
	
	vector<pair<int, pair<string, int> > > v;
	for (int i = 0; i < n; i++){
		char pName[8];
		int num;
		scanf("%s %d", pName, &num);
		v.push_back(make_pair(strlen(pName), make_pair((string)pName, num)));
	}
	
	sort(v.begin(), v.end());
	
	string lead = "$";
	int cnt = 0;
	for (int i = 0; i < n; i++){
		if (lead != v[i].second.first){
			if (lead != "$") printf("%s %d\n", lead.c_str(), cnt);
			lead = v[i].second.first;
			cnt = v[i].second.second;
		}
		else cnt += v[i].second.second;
	}
	return (!printf("%s %d\n", lead.c_str(), cnt));
}

num のアドレスを参照せず1RE.

1 発ACできないとはなさけない...