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