codeforces1176C 队列贪心+暴力

1175C 1300
题意:给你一个长度为n的数组,且其中的元素只能为这规定的6个数,设为0,1,2,3,4,5。然后问能从给定的数组中找出多少个这样的子序列,用过的数不能在用了。最后的答案即为为n-ans*6,(仅为自己的想法,感觉有可能偏离的主题)
思路:暴力贪心,用六个数组取存储这些数的下标,然后一个一个的进行贪心,能取则取,不能取就移除,一开始用了vector来进行操作,然后一看时间1899ms,将近2000ms了,怀疑自己的思路有问题,然后用队列进行操作,直接93ms,这。。。那就姑且算我的思路是对的把
队列操作代码如下:

#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define rep(i, a, n) for(int i = (int)a; i <= (int)n; i++)
#define per(i, a, n) for(int i = (int)n; i >= (int)a; i--)
#define IOS std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define fopen freopen("file.in","r",stdin);freopen("file.out","w",stdout);
#define fclose fclose(stdin);fclose(stdout);
const int inf = 1e9;
const ll onf = 1e18;
const int maxn = 1e5+10;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
	return x*f;
}
signed main(){
	int n = read();
	queue<int> v[6];	//六个队列存储下标
	rep(i,1,n){
		int x = read();
		if(x==4) v[0].push(i);
		else if(x==8) v[1].push(i);
		else if(x==15) v[2].push(i);
		else if(x==16) v[3].push(i);
		else if(x==23) v[4].push(i);
		else if(x==42) v[5].push(i);
	} 
	int ans = 0;
	while(v[0].size()){
		int tmp = v[0].front();v[0].pop();	//用tmp来标记当前的下标是多少
		int flag = 0;	//用来标记是否有符合条件的下标,如果没有直接退出
		rep(i,1,5){
			while(v[i].size()){
				int x = v[i].front();
				v[i].pop();
				if(x>tmp){
					flag = x; break;	//先用flag记录当前下标
				}
			}
			if(flag==tmp) flag = 0;	//如果相等的话,那么就意味着没有符合条件的下标,flag=0直接退出
			else tmp = flag;	//反之更新tmp
								//但还有一种情况那就是flag=0,tmp=某个数,这种是当前的数组为空的情况,但不影响结果,flag=0
			if(!flag) break;
		}
		if(!flag) break;
		ans++;
	}
	printf("%d\n", n-ans*6);
	return 0;
}

vector操作代码如下:
就不加注释了

#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define rep(i, a, n) for(int i = a; i <= n; i++)
#define per(i, a, n) for(int i = n; i >= a; i--)
#define IOS std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define fopen freopen("file.in","r",stdin);freopen("file.out","w",stdout);
#define fclose fclose(stdin);fclose(stdout);
const int inf = 1e9;
const ll onf = 1e18;
const int maxn = 5e5+10;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
	return x*f;
}
signed main(){
	int n =read();
	std::vector<int> v[6];
	rep(i,1,n){
		int x = read();
		if(x==4) v[0].push_back(i);
		else if(x==8) v[1].push_back(i);
		else if(x==15) v[2].push_back(i);
		else if(x==16) v[3].push_back(i);
		else if(x==23) v[4].push_back(i);
		else if(x==42) v[5].push_back(i);
	}
	int flag = 0, ans = 0;
	for(int i = 0; i < v[0].size(); i++){
		int tmp = v[0][i];
		for(int j = 1; j < 6; j++){
			while(1){
				if(v[j].size() && tmp>v[j][0]) v[j].erase(v[j].begin());
				else {
					if(v[j].size()) tmp = v[j][0], v[j].erase(v[j].begin());
					else flag = 1;
					break;
				}
			}
			if(flag) break;
		}
		if(flag) break;
		ans++;
	}
	printf("%d\n", n-ans*6);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值