2021-11-03

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爷帅你别太爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值