大理石在哪儿? Where is the Marble- UVA - 10474

大理石在哪儿? Where is the Marble? UVA - 10474

标签(空格分隔): 算法竞赛


这道题比较简单,所以我详写方法。
如果用以前的C语言方法的话,做的很快,但是用C++但方法来做,我还没学会。用C++牵扯到了排序函数sort、查找函数lower_bound。

    sort(排序下界,排序上界(,排序函数))。上界和下界为地址,排序函数为排序规律。如果不写排序函数,默认升序排列。降序函数书写如下(a在b之前)。意思是b排在a之后。

下面是一段比较函数的内容。注意,函数中的’<’和’>’表示了升降序;<为升,>为降。

bool cmp(int a,int b)
{
    return a>b;
}
    unique(下界,上界)。作用是去掉序列中相邻的重复数据,执行完毕后,返回最后一个元素的地址值。

unique有一个巧妙的用法,如果执行下面语句。

    int a[5]={1,1,2,2,3};
    int num=unique(a,a+5)-a;

输出的num值会是序列中重新排列的不重复数据的长度。但是数组后面的数据看不懂。

    lower_bound(检索下界,检索上界,检索元素x)

函数会返回大于等于x的第一个地址。结合unique的巧妙用法,可知这里也有同样的巧妙用法————减去数组首地址,就会得到检索元素的顺序数。但是注意,两个巧妙用法,得到的顺序数都是从0开始的

下面是错误代码

#include <cstdio>
#include <algorithm>
using namespace std;                //传统方法写的,re了。 
const int N = 1000;
int main()
{
    //freopen("example5-1.txt","wa",stdout);
    int a,b,k=1,ar[N],se;
    while (scanf("%d %d",&a,&b)&&a)
    {
        printf("CASE# %d:\n",k++); 
        for (int i=0;i<a;i++)
            scanf("%d",&ar[i]);
        sort(ar,ar+a);
        while (b--)
        {
            scanf("%d",&se);
            int j=lower_bound(ar,ar+a,se)-ar;
            if (ar[j]==se)
                printf("%d found at %d\n",se,j+1);
            else
                printf("%d not found\n",se);
        }
    }
    return 0;
} 

我照着答案检查了好几遍算法,除了变量名不同,就是找不出错误来。但是错误提示总是RE。到最后我才发现,原来是数组开小了,我开了100的,1000的都错,开10000就对了。这说明,数组开小了,可能会报错RE,而不是因为算法缺陷

posted @ 2018-02-17 23:18  CF过2100就买ARCTERYX  阅读(131)  评论(0编辑  收藏  举报