zoukankan      html  css  js  c++  java
  • 洛谷 P1540 机器 (简单模拟) (stl容器)

    1.朴素算法

    完全没必要把新数赋给word【0】然后所有数往后移一位,

    把【0】位想象成动态的才是较优解法

    维护一个“内存”数组,

    从前往后循环插数,

    多的直接覆盖掉,

    每次覆盖答案加一

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    
    const int MAXN = 1100;
    int txt[MAXN];
    int word[MAXN / 10]; 
    int ans = 0;
    
    
    int main()
    {
    	memset(txt, -1, sizeof(txt));//初始化
    	memset(word, -1,sizeof(word));
    	
    	int m, n;
    	cin>>m>>n;
    	
    	for(int i = 0; i < n; i++)
    	{
    		cin>>txt[i];
    	}
    	
    	int flag = 0;
    	
    	for(int i = 0; i < n; i++)
    	{
    		bool exct = false;
    		
    		for(int j = 0; j < m; j++)//查存在
    		{
    			if(word[j] == txt[i])
    			{
    				exct = true;
    				break;
    			}	
    		}
    		
    		if(!exct)//循环插数
    		{
    			word[flag++] = txt[i];
    			ans ++;
    			if(flag == m)
    				flag = 0;
    		}
    		
    	}
    	cout<<ans<<endl;
    	return 0;
    }

    2.stl容器

    find 查询 erase删除开始位 size查是否溢出 

    操作便利直观

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
    	vector <int> word;//申请容器
    	
    	int m, n, tmp, ans = 0;
    	cin>>m>>n;
    	
    	for(int i = 0; i < n; i++)
    	{
    		cin>>tmp;
    		if(find(word.begin(), word.end(), tmp) == word.end())//如果没查到 
    		{
    			word.push_back(tmp); //向后插入
    			ans ++;
    		}
    		if(word.size() > m) //插入后若溢出
    		{
    			word.erase(word.begin()); //删除头部
    		}
    	}
    	
    	cout<<ans<<endl;
    	
    	return 0;
    }
    



  • 相关阅读:
    【正则】——作业计算数学运算
    【面向对象】-类和对象作业
    【递归】
    笔记本linux问题记录
    监听器模式(Listener)
    Java引用类型
    Dubbo-服务发布-本地暴露/远程暴露
    完成一个Spring的自定义配置
    Dubbo SPI-Adaptive详解
    Dubbo-动态编译
  • 原文地址:https://www.cnblogs.com/zeolim/p/12270656.html
Copyright © 2011-2022 走看看