赛内题解
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);
}