今天刷到一题,题目思路很简单,但是我却硬生生卡了俩个小时,找不出原因真的令我很蛋疼。后面偶然找到错误,觉得自己实在过于愚蠢,因此写这篇博客记录一下。
Problem L: 数羊
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 1070 Solved: 408
Description
快码佳编四兄弟姐妹来到了大草原。
敕勒川,阴山下,
天似穹庐,笼盖四野。
天苍苍,野茫茫,
风吹草低见牛羊。
草原好美,他们玩的好开心。
突然,远处来了羊群。好多羊啊。
快码佳编四兄弟姐妹赶紧过来数羊。他们有的5个5个数,有的3个3个数,有的还按不同方式数了好几次,但非常奇怪的是,不管他们怎么数,总有一些羊剩下,而且更奇怪的如果再来几个羊,他们正好能数完不剩一个。你知道羊群里至少有多少只羊吗?
Input
第一行输入一个整数n和m表示有n种数法,每种数法总差m个羊才能每次正好数完
第二行输入n个整数A1,A2,…An,表示每种数法每次数的个数
其中2 <= n <=10, 1<= m < min(A1,A2,…An)
Output
一个整数表示羊群中至少有多少个羊
Sample Input
2 1
2 3
Sample Output
5
是不是很简单的一道题,具体过程我就不过多阐述了。。
一开始我卡住的原因是我先将数据排序,再令最大的值加一得出的值作为我迭代的初始值,其实这样子很多情况下都是对的,但是,若数羊的方法中存在羊的数量小于数羊方法的数量,这样就会导致错误。具体的话可以选择下面这个测试集试一下就知道了:
2 1
2 3
错误的代码
#include<bits/stdc++.h>
using namespace std;
int cmp(int a, int b)
{
return a < b;
}
int main()
{
int n,m;
int a[1300];
while (cin >> n>>m)
{
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + 1 + n, cmp);
int ans = a[1]+1;
while (1)
{
int judge = 1;
for (int j=1 ; j <= n; j++)
{
if ((ans + m) % a[j] != 0)
{
judge = 0;
break;
}
}
if (judge == 1) break;
ans++;
}
printf("%d\n", ans);
}
}
正确的代码
#include<bits/stdc++.h>
using namespace std;
int cmp(int a, int b)
{
return a < b;
}
int main()
{
int n,m;
int a[1300];
while (cin >> n>>m)
{
//输入个各
for (int i = 1; i <= n; i++) cin >> a[i];
int ans = 1;
while (1)
{
int judge = 1;
for (int j=1 ; j <= n; j++)
{
if ((ans + m) % a[j] != 0)
{
judge = 0;
break;
}
}
if (judge == 1) break;
ans++;
}
printf("%d\n", ans);
}
}
实际上就让初始值从0或者从1开始就可以,我把这道题想复杂了。