中级光能
题目:
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追加了内容
结果:
新手光能
你的这些语句应该放在第二重循环(循环变量为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;
}
}
}
望采纳!
新手天翼
你这是老师的方法吧?
我找了半天也没找到你错在哪,不过给你一个老师的;(这个运行结果好像不对,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;
好的。