牛客竞赛语法入门班数组栈队列和stl习题未完成

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客竞赛语法入门班数组栈队列和stl习题未完成相关的知识,希望对你有一定的参考价值。

题单地址:https://ac.nowcoder.com/acm/contest/19850?from=acdiscuss

目录

老子的全排列呢

#include<bits/stdc++.h>
using namespace std;
int a[15];
int main(void)

	for(int i=0;i<8;i++) a[i]=i+1;
	do
	
		for(int i=0;i<8;i++) cout<<a[i]<<" ";
		cout<<endl;
	while(next_permutation(a,a+8));
	return 0;

装进肚子

#include<bits/stdc++.h>
using namespace std;
struct nodeint a,b;Node[100005]; 
bool cmp(node a,node b)

	return a.a-a.b<b.a-b.b; 

int main(void)

	int n,k; cin>>n>>k;
	for(int i=0;i<n;i++) cin>>Node[i].a;
    for(int i=0;i<n;i++) cin>>Node[i].b;
	sort(Node,Node+n,cmp);
	long long int sum=0;
	for(int i=0;i<n-k;i++) sum+=Node[i].b;
	for(int i=n-k;i<n;i++) sum+=Node[i].a;
	cout<<sum<<endl;
	return 0;

牛牛的三角形

#include<bits/stdc++.h> 
using namespace std;
const int N=1e5+10;
int a[N],n;
bool check(int s1,int s2,int s3)

	return s1+s2>s3;

int main(void)

	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	sort(a,a+n);
	for(int i=0;i<n;i++)
	
		for(int j=i+1;j<n;j++)
		
			for(int k=j+1;k<n;k++)
			
				if(check(a[i],a[j],a[k])) 
				
					cout<<a[i]<<" "<<a[j]<<" "<<a[k]<<endl;
					return 0;
				
			
		
	
	puts("No solution");
	return 0;

[NOIP1998]拼数

#include<bits/stdc++.h>
using namespace std;
string s;
vector<string>ve;
bool cmp(string a,string b) return a+b>b+a;
int main(void)

	int n; cin>>n;
	while(n--) cin>>s,ve.push_back(s);
	sort(ve.begin(),ve.end(),cmp);
	for(int i=0;i<ve.size();i++) cout<<ve[i];

好串

#include<bits/stdc++.h>
using namespace std;
stack<char>st;
int main(void)

	string s; cin>>s;
	for(int i=0;i<s.size();i++)
	
		if(s[i]=='a'|| !st.size()) st.push(s[i]);
		else
		
			if(st.top()=='a'&&s[i]=='b') st.pop();
			else st.push(s[i]);
		
	
	if(st.size()) cout<<"Bad";
	else cout<<"Good";
	return 0;

Rails

题目的意思: 就是给我们一个排列,看1-n的入栈顺序,出栈可不可以构成这个排列。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n;
int main(void)

	while(cin>>n,n!=0)
	
		while(cin>>a[0],a[0]!=0)
		
			for(int i=1;i<n;i++) cin>>a[i];
			stack<int>st;
			for(int i=0,k=1;k<=n;k++)
			
				st.push(k);
				while(st.size()&&st.top()==a[i]) st.pop(),i++;
			
			if(st.size()) puts("No");
			else puts("Yes");
		
		cout<<endl;
	
	return 0; 
 

栈和排序


错误的想法就是,将入栈顺序保存,并从大到小排序。然后枚举入栈顺序比对,如果是比对的,则输组向后移动一位,
否则入栈。

6
6 4 3 5 1 2
正解: 6 5 3 4 2 1 
错误解:6 5 2 1 3 4

正解:就是用一个数组保存,该位置向后的最大值。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],s[N],n;
int main(void)

	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=n;i>=1;i--) s[i]=max(a[i],s[i+1]);
	stack<int>st;
	for(int i=1;i<=n;i++)
	
        st.push(a[i]);
		if(a[i]>=s[i]) cout<<a[i]<<" ",st.pop();//该值比后面的值都大
		while(st.size()&&st.top()>s[i+1]) cout<<st.top()<<" ",st.pop();

	 
	while(st.size()) cout<<st.top()<<" ",st.pop();
	return 0;

吐泡泡

#include<bits/stdc++.h>
using namespace std;
int main(void)

	string s; 
	while(cin>>s)
	
		deque<char>q;
		for(int i=0;i<s.size();i++)
		
			if(!q.size()||(q.back()=='o'&&s[i]=='O') || (q.back()=='O'&&s[i]=='o')) q.push_back(s[i]);
			else 
			
				bool flag=1;
				q.push_back(s[i]);
				while(flag&&q.size()>1)
				
					auto temp1=q.back(); q.pop_back();
					auto temp2=q.back(); q.pop_back();
					if(temp1==temp2&&temp1=='o') q.push_back('O');
					else if(temp1!=temp2)
					
						flag=0;
						q.push_back(temp2);
						q.push_back(temp1);
					
				
			
		
		while(q.size())  cout<<q.front(),q.pop_front();
        cout<<endl;
	
	return 0;

Keep In Line

#include<bits/stdc++.h>
using namespace std;
int t,n;
int main(void)

	cin>>t;
	while(t--)
	
		cin>>n;
		queue<string>q;
		map<string,int>mp;
		int cnt=0;
		for(int i=0;i<n;i++)
		
			string op,s; cin>>op>>s;
			mp[s]++;
			if(op=="in") q.push(s);
			else
			
				mp[s]=0;
				if(q.front()!=s) cnt++;
			
			while(q.size()&&!mp[q.front()]) q.pop();
		
		cout<<mp.size()-cnt<<endl;
	
	return 0;

Number

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int cnt,prime[N],st[N],ans;
set<int>s;
void init()

	int n=7073;
	for(int i=2;i<=n;i++)
	
		if(!st[i]) prime[cnt++]=i;
		for(int j=0;prime[j]<=n/i;j++)
		
			st[i*prime[j]]=1;
			if(i%prime[j]==0) break;
		
	

int main(void)

	init();
	int n; cin>>n;
	for(int i=0;i<cnt;i++)
	
		if(pow(prime[i],2)<n)
		for(int j=0;j<cnt;j++)
		
			if(pow(prime[j],3)<n)
			for(int k=0;k<cnt;k++)
			
				int sum=pow(prime[i],2)+pow(prime[j],3)+pow(prime[k],4);
                if(sum>n) break;
				s.insert(sum);
			
		
	
	cout<<s.size();
	return 0;

指纹锁

#include<bits/stdc++.h>
using namespace std;
int n,k;
struct cmp 
    bool operator ()(const int& a, const int& b)const 
        if(abs(a - b) <= k)
            return false;
        return a < b;
    
;
set<int,cmp>st;
int main(void)

    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
	cin>>n>>k;
	while(n--)
	
		string op;
		int x; cin>>op>>x;
		if(op=="add") st.insert(x);
		else if(op=="del") st.erase(x);
		else 
		
			if(st.find(x)!=st.end()) cout<<"Yes"<<'\\n';
			else cout<<"No"<<'\\n';
		
	
	return 0;

younik要排号

#include<bits/stdc++.h>
using 牛客竞赛语法入门班数组字符串习题完结

牛客竞赛语法入门班循环结构习题完结

牛客竞赛语法入门班顺序结构习题完结

牛客竞赛语法入门班选择结构习题完结

牛客竞赛语法入门班循环结构习题完结

2021算法竞赛入门班第三节课堆栈队列并查集等习题