5 条题解

  • 2
    @ 2023-4-13 14:07:40

    一道很好练习队列的题目

    本题无非就是几种情况:

    • 队列满,数字不在队列中,弹出队首并且插入数字,次数+1
    • 队列不满,数字不在队列中,插入数字,次数+1
    • 若数字在队列中,不管
    #include <bits/stdc++.h>
    using namespace std;
    queue<int> q;
    unordered_map<int,int> um;
    
    int m,n,cnt;
    
    bool Full() {return q.size() == m;}
    
    int main()
    {
    	cin >> m >> n;
    	while(n--)
    	{
    		int x;
    		cin >> x;
    		if(Full())
    		{
    			if(!um[x])
    			{
    				int t = q.front();
    				q.pop();
    				q.push(x);
    				um[x]++;
    				um[t]--;
    				cnt++;
    			}
    		}
    		else
    		{
    			if(!um[x])
    			{
    				q.push(x);
    				um[x]++;
    				cnt++;
    			}
    		}
    	}
    	cout << cnt;
    	return 0;
    }
    
    • 0
      @ 2025-4-13 17:05:22
      m,n=map(int,input().split())
      queue=['-1' for i in range(m)]
      t=0
      cnt=0
      for i in input().split():
          if i in queue:
              continue
          else:
              cnt+=1
              for j in range(m):
                  if queue[j]=='-1':
                      queue[j]=i
                      t=1
                      break
              if t==0:
                  del queue[0]
                  queue.append(i)
              t=0
              
      print(cnt)
      

      这道题目的数据有点问题,第二行如果把列表初始化全部是0的话过不了最后两个点,但改成-1能AC (所以n是会等于0的……)

      • -1
        @ 2024-10-23 11:45:27
        def f(lt,s,e,t,mx): #查找英文单词是否在内存里
            flag=False
            while s!=e:
                if t==lt[s]:
                    flag=True
                    break
                s=(s+1)%mx
            return flag
        
        m,n = map(int,input( ).split( ))   #输入内存单元数m和英语文章长度为n(空格分隔)
        la = list(map(int,input( ).split( )))   #依次读入n个英文单词,用正整数表示(空格分隔)
        maxsize=m+1
        lb=[-1]*maxsize
        head,tail=0,0
        ans=0
        for i in range(n):
            t=la[i]
            if not f(lb,head,tail,t,maxsize):
                if head==(tail+1)%maxsize:
                    head=(head+1)%maxsize
                lb[tail]=t
                tail=(tail+1)%maxsize
                ans+=1
        print(ans)
        
      • -2
        @ 2024-10-23 11:43:17
        def f(lt,s,e,t,mx): #查找英文单词是否在内存里
            flag=False
            while s!=e:
                if t==lt[s]:
                    flag=True
                    break
                s=(s+1)%mx
            return flag
        
        m,n = map(int,input( ).split( ))   #输入内存单元数m和英语文章长度为n(空格分隔)
        la = list(map(int,input( ).split( )))   #依次读入n个英文单词,用正整数表示(空格分隔)
        maxsize=m+1
        lb=[-1]*maxsize
        head,tail=0,0
        ans=0
        for i in range(n):
            t=la[i]
            if not f(lb,head,tail,t,maxsize):
                if (tail+1)%maxsize==head:
                    head=(head+1)%maxsize
                lb[tail]=t
                tail=(tail+1)%maxsize
                ans+=1
        print(ans)
        
        • -5
          @ 2024-10-23 11:37:20
          def f(lt,s,e,t,mx): 
              flag=False
              while s!=e:
                  if t==lt[s]:
                      flag=True
                      break
                  s=(s+1)%mx
              return flag
          
          m,n = map(int,input( ).split( ))   
          la = list(map(int,input( ).split( )))   
          maxsize=m+1
          lb=[-1]*maxsize
          head,tail=0,0
          ans=0
          for i in range(n):
              t=la[i]
              if not f(lb,head,tail,t,maxsize):
                  if (tail+1)%maxsize==head:
                      head=(head+1)%maxsize
                  lb[tail]=t
                  tail=(tail+1)%maxsize
                  ans+=1
          print(ans)
          
          • 1

          信息

          ID
          128
          时间
          1000ms
          内存
          128MiB
          难度
          5
          标签
          递交数
          634
          已通过
          241
          上传者