牛客竞赛语法入门班数组栈队列和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 牛客竞赛语法入门班数组字符串习题完结