csust2020新生赛热身赛题解

1.a+b

#include<iostream>
using namespace std;
int main(){
    
    
  	int t;cin>>t;
  	while(t--){
    
    
      int a,b;
      cin>>a>>b;
      cout<<a+b<<endl;
    }
  	return 0;
}

2.Psycho-Pass

#include <bits/stdc++.h>
using namespace std;

const int mac=1e5+10;

char s[mac];

int main()
{
    
    
    int nb=0;
    scanf ("%s",s);
    int len=strlen(s);
    for (int i=0; i<len; i++)
        if (s[i]=='1') nb++;
    printf ("%d\n",nb);
    return 0;
}

3.括号匹配
这个就是个简单的栈的理解运用,用sum记录一个数据,在遇到’(‘则加一,遇到’)’则减一,在从前往后扫描的过程中,sum始终不为负数,并且扫描完成后sum等于0输出YES即可。

#include <bits/stdc++.h>
using namespace std;

const int mac=1e5+10;

char s[mac];

int main()
{
    
    
    int n;
    scanf ("%d",&n);
    scanf ("%s",s+1);
    int sum=0;
    for (int i=1; i<=n; i++){
    
    
        if (s[i]=='(') sum++;
        else sum--;
        if (sum<0) {
    
    
            printf ("NO\n");
            return 0;
        }
    }
    if (sum>0) printf ("NO\n");
    else printf ("YES\n");
    return 0;
}

4.jcc爱踢球
由于每轮都是偶数只队伍,那么这就相当于一颗满二叉树了,我们经常看电视的时候每次比赛都基本会出现树状图。

我们每次只记录叶节点的编号(假设为i),那么下一次的新叶节点编号(即旧叶节点的父亲)为(i+1)/2如图所示:

在这里插入图片描述

那么他们相遇也就是父节点相同的时候,而每找一次父节点计数器加一,则最后的计数器的值(记为S)就是树的深度-1,也是比赛是场数,最后如果2S为总的队伍数,则说明决赛相遇。

#include <bits/stdc++.h>
using namespace std;

int pow(int a,int s)
{
    
    
    int ans=1;
    for (int i=1; i<=s; i++)
        ans*=a;
    return ans;
}

int main()
{
    
    
    int n,a,b;
    scanf ("%d%d%d",&n,&a,&b);
    int s=0;
    while (a!=b){
    
    
        a=(a+1)/2;
        b=(b+1)/2;
        s++;
    }
    if (n-pow(2,s)==0) printf ("Final!\n");
    else printf ("%d\n",s);
    return 0;
}

5.食堂打饭
用两个双指针维护一下区间和就行

#include <bits/stdc++.h>
#define pb push_back
#define m_p make_pair
#define pii pair<int, int>
#define fi first
#define se second
typedef long long ll;
using namespace std;
int n,m;
const int maxn = 2e5+100;
int a[maxn];
int main()
{
    
    
    int t;
    scanf("%d",&t);
    while(t--)
    {
    
    
        scanf("%d%d",&n,&m);
        int tmp = 0,res = 0;
        for(int i = 1;i<=n;i++)
        {
    
    
            scanf("%d",a+i);
            if(i<=m) tmp+=a[i];
        }
        res = tmp;
        for(int i = m+1;i<=n;i++)
        {
    
    
            tmp+=a[i];
            tmp-=a[i-m];
            res = max(tmp,res);
        }
        printf("%d\n",res);

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45755679/article/details/111356970