冬令营周报 week1 smu div2 题解加补题

赛内题解

A 题

不可以总司令
在这里插入图片描述

水题,直接判断即可。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	if(n>m)
	cout<<"NO";
	else if(n<m)
	cout<<"YES";
	else if(n==m)
	cout<<"equal probability";
	
}

B题

计算
在这里插入图片描述

水题,分离个十百位然后加起来处理就行。

#include<bits/stdc++.h>
using namespace std;
int a[3];
void solve(int n)
{   int i=0;
	while(n>0)
   	{
   		a[i]=n%10;
		i++;
		n/=10;
	}
 } 
int main()
{
	int i,sum=0,sum1=0,sum2=0;
	int n;
	cin>>n;
	solve(n);
	for(i=0;i<3;i++)
	{
		sum+=a[i];
	}
	for(i=0;i<3;i++)
	{
		
	}
	for(i=0;i<3;i++)
	{
		sum1=sum*sum;
	}
	for(i=0;i<3;i++)
	{
		sum2=sum*sum*sum;
	}
	cout<<sum<<endl;
	cout<<sum1<<endl;
	cout<<sum2<<endl;
	
}

I 题

毕业后

题意

要在挂科人数最多的同时保证每个人都能毕业,那么就是每个人都挂了一门,但是这一门是哪一门不确定,那么我们把每个挂科的人分给各个科目就好了,然后根据题目要求向下取整,利用函数floor()即可解决。
代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	double a,b;
	cin>>a>>b;
	double ans;
	ans=floor(b/a)/b;
	cout<<ans;
}

J 题

旋转排列
题意,每一次处理把头尾交换,然后输出,直到尾部的数字等于n。

#include<bits/stdc++.h>
using namespace std;
int main()
{  int n,i,temp;
	cin>>n;
    int s[n+5],a[n+5];
    for(i=0;i<n;i++)
    {
        cin>>s[i];
    }
    while(1)
    {
        a[0]=s[n-1];
        for(i=0;i<n-1;i++)
        {
            a[i+1]=s[i];
        }
        for(i=0;i<n;i++)
        {
            s[i]=a[i];
        }
        for(i=0;i<n;i++)
        {
            cout<<s[i]<<" ";
        }
        cout<<endl;
        if(s[n-1]==n)
            break;
    }

}

K 题

标题计数

题意

很好理解,看有多少个一级标题。根据一级标题的定义我们可以知道,我们得找到字符串第一个非空格位置得是’#'号,后面跟着的得是空格,那么每次输入都这样处理就可以得到答案了。
代码

#include<bits/stdc++.h>
using namespace std;
int main() {
    int k, i, cnt = 0;
    cin >> k;
    char str[105];
    getchar();
    while (k--) {
    	i=0;
        scanf("%[^\n]", str);
        getchar();
        while(str[i]==' ')
        i++;
        if (str[i] != '#')
                continue;
       	i++;
		if(str[i]!=' ')
		continue;
		while(str[i]==' ')
		i++;
		if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')||str[i]=='#') 
		cnt++;
    }
    cout << cnt;}

补题

狠狠的切割简单版
题意
在这里插入图片描述
那么这道题可以这样去想,由于数据范围比较小,利用标记法看数字是否在b数组出现过,如果出现过那么就标记,最后统计的时候找到没标记过的和标记过的两个相邻元素,即为所求的一段,对a数组的最后一个元素特判即可。

#include<bits/stdc++.h>
using namespace std;
int main() {
    int k, i, cnt = 0;
    cin >> k;
    char str[105];
    getchar();
    while (k--) {
    	i=0;
        scanf("%[^\n]", str);
        getchar();
        while(str[i]==' ')
        i++;
        if (str[i] != '#')
                continue;
       	i++;
		if(str[i]!=' ')
		continue;
		while(str[i]==' ')
		i++;
		if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')||str[i]=='#') 
		cnt++;
    }
    cout << cnt;}

狠狠的切割难版
由于数据范围比较大,直接用标记法肯定是不行了这种时候我们就得想到一个方法去缩小我们需要去比较的范围。有一个聪明的方法,就是利用二分法,把b数组中的元素按照顺序排列后,再把a数组中的元素放进去看看是否在b数组内,判断思路大致和上面一样,特判不变。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a[500005],b[500005],m,ans=0;
bool check(ll k)
{   ll l=0,r=m,mid;
	while(l<=r)
	{   
		mid=(l+r)/2;
		if(k<b[mid])
		{
			r=mid-1;
		}
		else if(k>b[mid])
		{
			l=mid+1;
		}
		else
		return 1;
	}
	return 0;
}
int main()
{
	int i;
	cin>>n>>m;
	for(i=0;i<n;i++)
	scanf("%lld",&a[i]);
	for(i=0;i<m;i++)
	scanf("%lld",&b[i]);
	sort(b,b+m);
	if(!check(a[n-1]))
	ans++;
	for(i=0;i<n-1;i++)
	{
		if(!check(a[i])&&check(a[i+1]))
		ans++;
	}
	printf("%lld",ans);
	
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值