洛谷 P1540 机器翻译

https://www.luogu.com.cn/problem/P1540

详细内容见链接。

刚开始第一眼以为是当作字符串进行处理,后来发现将其当作数字字符串更好做。

题目要求进行统计新单词的出现次数,那么由此考虑自然会发现存在两种情况。

总体思路,设置两个数组marrnarr分别存储字典内容和文章单词,题目要求输入非负整数,也就是可以输入0,

于是我将marr数组中全部赋值为-1,由于文章肯定存在单词不存在0个单词的特殊情况,

然后便开始进行遍历,如果下一个单词不存在于字典内存中,便将其放入字典内存中,因而存在两种情况:

第一种:字典内存大于文章单词数

第二种:字典内存小于文章单词数并且总共的新单词数大于字典内存

对于第一种:上述思路很容易解答出来

对于第二种:有一种特殊情况,当字典内存满的时候,这时如题目所说需要从开始重新进行赋值,因此数组下标需要重新变成0


代码如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdbool.h>
 4 int marr[105],narr[1005],m,n;
 5 bool out(int num){
 6     for(int i = 0; i < m; i ++){
 7         if(marr[i] == narr[num]){    //判断是否在字典内存中,在false,不在true 
 8             return false;
 9         }
10     }
11     return true;
12 }
13 int main(){
14     int cnt = 0;
15     for(int i = 0; i < 105; i ++){        //先将字典内存初始化为 -1 
16         marr[i] = -1;
17     }
18     scanf("%d %d",&m,&n);
19     for(int i = 0; i < n; i ++){
20         scanf("%d",&narr[i]);
21     }  
int j = -1; 25 for(int i = 0; i < n ; i ++){ 26 if(out(i) && j != m - 1){ //字典中没有且内存没满 27 marr[++j] = narr[i]; 28 cnt++; 29 }else if(out(i) && j == m - 1){//j为m - 1的时候字典内存才算满,下一步便是下标初始化为0 30 j = -1; 31 marr[++j] = narr[i]; 32 cnt++; 33 } 34 } 35 printf("%d ",cnt); 36 return 0; 37 }
原文地址:https://www.cnblogs.com/pureayu/p/12246537.html