Problem 1402 猪的安家
Accept: 1385 Submit: 7593 Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
Andy和Mary养了很多猪。他们想要给猪安家。但是Andy没有足够的猪圈,很多猪只能够在一个猪圈安家。举个例子,假如有16头猪,Andy建了3个猪圈,为了保证公平,剩下1头猪就没有地方安家了。Mary生气了,骂Andy没有脑子,并让他重新建立猪圈。这回Andy建造了5个猪圈,但是仍然有1头猪没有地方去,然后Andy又建造了7个猪圈,但是还有2头没有地方去。Andy都快疯了。你对这个事情感兴趣起来,你想通过Andy建造猪圈的过程,知道Andy家至少养了多少头猪。
Input
输入包含多组测试数据。每组数据第一行包含一个整数n (n <= 10) – Andy建立猪圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示Andy建立了ai个猪圈,有bi头猪没有去处。你可以假定(ai, aj) = 1.
Output
输出包含一个正整数,即为Andy家至少养猪的数目。
Sample Input
3 3 1 5 1 7 2
Sample Output
16
Source
Andy Zhau’s Contest No.1
解决方案1
#include<iostream>
int main() {
int n, i, sum, flag, j;
int a[10][2];
while (scanf("%d", &n) != EOF) {
for (i = 0; i < n; i++) {
scanf("%d %d", &a[i][0], &a[i][1]);
}
i = 0;
sum = a[n - 1][1];
while (1) {
flag = 1;
for (j = 0; j < n - 1; j++) {
if (sum%a[j][0] != a[j][1]) {
flag = 0;
break;
}
}
if (flag == 1) {
break;
}
else {
i++;
sum = a[n - 1][0] * i + a[n - 1][1];
}
}
printf("%d\n", sum);
}
}
Time Limit Exceed
解决方案2
本题应当注意的地方:
- ai与aj互质
- 应当用long long数据类型
思路:先求出最小满足第一行的,如例题中3+1=4,再验证是否符合第二行。4%5!=1,所以再把4递加3,直到(4+3*x)%5==1。继续验证下一行,不过递加要变为3和5的最小公倍数,一直循环到n,最后的总的最小公倍数即是答案。
#include<iostream>
typedef long long ll;
int main() {
int n, i, flag, j;
ll sum, times;
ll a[10][2];
while (scanf("%d", &n) != EOF) {
for (i = 0; i < n; i++) {
scanf("%I64d%I64d", &a[i][0], &a[i][1]);
}
times = a[0][0];
sum = a[0][1];
for (i = 1; i < n; i++) {
while (sum%a[i][0] != a[i][1]) {
sum += times;
}
times *= a[i][0];
}
printf("%I64d\n", sum);
}
}