问题标题: 酷町堂:求大神帮忙找错1382 记事本

1
0
已解决
王梓澳
王梓澳
中级光能
中级光能

题目:

1382   记事本

题目描述 Description

小王有一个好习惯,那是就是每天坚持背单词,小王的记性不太好,但是小王有自己的方法。 他随身会携带一个记事本,将单词记到本子里面,但是有一个问题,记事本只有M页,并且每页只能记录一个单词。 当他碰到一个单词,他就会去记事本里查询单词的翻译,如果记事本里没有记录这个单词的话,小王就需要查字典了,然后再将单词记录到记事本里,以备后续的查找。 如果记事本里有这个单词,那小王就可以立马知道单词的意思啦。

假设记事本中有M页,每页只能记录一个单词。每当小王将一个新单词(记事本里没有记录的单词)记录到单词本前,如果当前记事本中已经记录的单词数不超过M,小王就会将新单词存入一个未使用的页里;若记事本中已记录M个单词,小王只能清空最早记录的那个单词,腾出这一页用来记录新单词。

一天小王阅读一篇文章,文章的长度为N个单词,请问小王总共需要查多少次字典?假设在阅读开始前,小王的记事本里中没有记录任何单词。

输入描述 Input Description

输入文件共2行。

第一行为两个正整数M和N,代表记事本总共的页数和文章的长度。

第二行为N个非负整数,按照文章的顺序,每个数(大小不超过1000)代表一个英文单词。如果两个单词相同的话,那它们对应的非负整数就是相同的。

对于10%的数据有M=1,N≤5。

对于100%的数据有0<=M<=100,0<=N<=1000

输出描述 Output Description

包含一个整数,小王总共需要查多少次字典。

样例输入 Sample Input


 

3 7
1 2 1 5 4 4 1

样例输出 Sample Output


 

5

题目网址:1382 记事本

我的代码:

#include <iostream>
using namespace std;
int main ()
{
    int m,n,a[1000],h=1,t=1,count=0;
    cin>>m>>n;
    for (int i=1;i<=n;i++)
    {
        int temp,flag=0;
        cin>>temp;
        for (int j=h;j<=t;j++)
        {
            if (temp==a[j])
            {
                flag=1;
                break;
            }
            if (flag==0)
            {
                count++;
                a[t]=temp;
                t++;
                if (t-h>m)
                    h++;
            }
        }
    }
    cout<<count;
    return 0;
}

 

王梓澳在2018-02-23 15:45:33追加了内容

结果:


0
已采纳
方亦欧
方亦欧
新手光能
新手光能

你的这些语句应该放在第二重循环(循环变量为j的那个)外面:

if (flag==0)
            {
                count++;
                a[t]=temp;
                t++;
                if (t-h>m)
                    h++;
            }

你的第二重循环是为了判断记事本中是否有这个单词,这个操作应该遍历完整个a数组后才能够继续根据flag的值来判断是否需要在记事本中添加单词,而你却在循环里面就执行塞单词的操作,这样的话如果记事本中有这个单词但还没有遍历到,你仍然会执行添加单词的操作并将count++。这样你在一个循环中会执行添加单词操作多次,自然最后count的值会非常大。

举个例子,假如记事本中有以下几个单词:

1 2 3 4 5

然后给你一个单词5。这样的话当你进行遍历的时候,前四次都不满足,导致塞单词操作被执行了4次,然而由于记事本中已经有5这个单词,应该是一次也不用执行。

不仅如此,你的往记事本里添加单词的操作也有问题。当记事本已满的时候,程序应该清空a[1]并将temp塞进a[1](t也要同时赋0),否则直接temp=a[t]并t++,但是你却没有这样做,仍然将temp赋值给a[t],然而当记事本已满时,这样做将会将temp赋值给不属于记事本范围内的数组元素,不符合题意。

你的程序应该这样写:

for (int i=1;i<=n;i++)
{
        int temp,flag=0;
        cin>>temp;
        for (int j=1;j<=m;j++) {   //你原来写了j=h to m,但我不明白这是什么意思。遍历数组应该从1 to m
            if (temp==a[j])
            {
                flag=1;
                break;
             }
        }
        //以下内容应在第二重循环之外
        if(!flag)
        {
            count++;
            if(t==m)
            {
                t=1;
                a[t]=temp;
                t++;
             }
            else 
            {
                t++;
                a[t]=temp;     
             }  
         }     
 }

望采纳!

0
马佳滢
马佳滢
新手天翼
新手天翼

你这是老师的方法吧?

我找了半天也没找到你错在哪,不过给你一个老师的;(这个运行结果好像不对,100分却可以)

定义 m,n,数组a[长度500],h赋初始值1,t赋初始值1,count赋初始值0;
    输入m、n;
    循环(整形定义 i从1循环到n)
    {
        定义 temp,flag赋初始值0;
        输入temp;
        循环(整形定义 j从h循环到t)
        {
            如果(temp定义a[j])
            {
                flag赋初始值1;
                break;
            }
        }
        如果(flag等于0)
        {
            count加加;
            a[t]赋值temp;
            t加加;
            如果(减h大于m)
                h加加;
        }
    }
    输出count;
    返回值 0;

好的。

0
邵逸儒
邵逸儒
中级天翼
中级天翼

1.改为

2.致命错误

这个在循环外面

0
我要回答