2021.11.2新生训练题
传送门
A.题解:括号配对问题
#include<iostream>
#include<queue>
#include<stack>
#include<string.h>
using namespace std;
char s[10005];
int main(){
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
stack<char>q;
for(int i = 0;i<strlen(s);i++){
if(q.empty()){
q.push(s[i]);
continue;
}
if(s[i]==')'&&q.top()=='('){
q.pop();
}else if(s[i]==']'&&q.top()=='['){
q.pop();
}else{
q.push(s[i]);
}
}
if(q.empty()){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}
B.题解:队列的基本操作
#include<stdio.h>
#include<stack>
#include<queue>
using namespace std;
queue<int>qq;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
while(n--)
{
char ss[105];
scanf("%s",ss);
if(ss[1]=='u')
{
int m;
scanf("%d",&m);
qq.push(m);
}
else
qq.pop();
}
if(!qq.empty())
{
while(!qq.empty())
{
printf("%d ",qq.front());
qq.pop();
}
printf("\n");
}else
printf("no eggs!\n");
}
return 0;
}
C.题解:冒泡排序,累加交换次数
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
unsigned a[10010];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int sum=0;
for(int i=1;i<n;i++)
{
for(int j=1;j<=n-i;j++)
{
if(a[j]>a[j+1])
{
swap(a[j],a[j+1]);
sum++;
}
}
}
cout<<sum;
return 0;
}
D.题解
方法一:使用数组
#include <iostream>
using namespace std;
int main()
{
int n, t;
cin >> t;
while (t--)
{
int n;
cin >> n;
if(n<=3) //如果人数少于3 直接输出 这点要注意 容易被忽略
{
if(n == 1) cout<<"1"<<endl;
if(n == 2) cout<<"1 "<<"2"<<endl;
if(n==3)
cout<<"1 "<<"2 "<<"3"<<endl;
}
else
{
int a[5000];
for (int k = 0; k <= n; k++) //首先每个人设为1
a[k] = 1;
int b = 2, l = n, j = 0; 第一轮是报到二的出列
for (int i = 1; i <= n ; i++)
{
if (a[i]) // 没有出列的进行报数
{
j++;
if (j == b) //报到b 出列 设为0
{
a[i] = 0; //已经出列的设为0
j = 0;
}
}
if (i == n) //一轮已经报完 重新开始
{
l -= (l / b); // 总人数没一轮会减少l/b
if (l <= 3) break;
if (b == 2) b = 3; // b 要改变
else b = 2;
i = 0;
j = 0;
}
}
int w = 0;
for (int h = 1; h <= n; h++) //从新开始找如果为一就是没有出列的人 输出
if (a[h])
{ w++;
cout << h;
if(w<l)cout<<" ";
else cout<<endl;
}
}
}
return 0;
}
方法二:使用队列
#include <cstdio>
#include <queue>
using namespace std;
int a[50001],f,t,n,ff;
queue<int>q;
void sortt(int x){
int s=q.size();
for(int i=1;i<=s;i++){
if(i%x==0)q.pop();
else{
q.push(q.front());
q.pop();
}
}
}
int main(){
while(!q.empty())q.pop();
while(scanf("%d",&t)!=EOF){
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++)q.push(i);
f=1;
while(q.size()>3){
if(f==1){
f=0;
sortt(2);
continue;
}
if(f==0){
f=1;
sortt(3);
continue;
}
}ff=0;
while(!q.empty()){
if(ff==1){
printf(" %d",q.front());
q.pop();
}
else{
ff=1;
printf("%d",q.front());
q.pop();
}
}
printf("\n");
}
}
}
E.题解:sort排序,累加判断大小
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
int n,h,s,a[1000000],cnt,tot;
map<int,int>ma;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
cin>>n>>h;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1,cmp);
while(s<h)
{
s+=a[++cnt];
tot++;
}
cout<<tot;
return 0;
}