https://www.luogu.com.cn/problem/P1540
详细内容见链接。
刚开始第一眼以为是当作字符串进行处理,后来发现将其当作数字字符串更好做。
题目要求进行统计新单词的出现次数,那么由此考虑自然会发现存在两种情况。
总体思路,设置两个数组marr和narr分别存储字典内容和文章单词,题目要求输入非负整数,也就是可以输入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 }