洛谷 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;
}



posted @ 2018-05-22 09:41  张浦  阅读(137)  评论(0编辑  收藏  举报