18/10/19 周五欢乐赛题解(c++版) 注意本题解并没有去追求最优解,只是用比较暴力的方法求解。D题听说要改说明不是位数30位,目前除了D题可能有问题之外其他代码已经全部正确。 A.查找字串 代码 B.A+B Problem 代码 C.斜率 代码 D.小明的成绩 代码 E.DQ数球 代码 F.环形求和 代码 G.数字换位 代码 H.数字统计 代码

A.查找字串

用string BF(暴力求解即可)

代码

#include <bits/stdc++.h>
using namespace std;
main()
{
	string a,b;
	cin>>a>>b;
	for(int i=0;i<a.size();i++)
	{
		int f=1;
		if(a[i]==b[0])
		{
			for(int j=0;j<b.size();j++)
			if(a[i+j]!=b[j])
			{
				f=0;
				break;
			}
			if(f) 
			return cout<<"Y",0;
		}
	}
	cout<<"N";
}

B.A+B Problem

a+b不多解释,注意用long long

代码

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

C.斜率

非常简单的数学题,注意斜率不存在即为Δx为0

代码

#include <bits/stdc++.h>
using namespace std;
main()
{
	double ax,ay,bx,by;
	cin>>ax>>ay>>bx>>by;
	if(bx-ax==0)
	return cout<<"NO",0;
	double k=(by-ay)/(bx-ax);
	printf("%.2lf",k);
}

D.小明的成绩

直接在输入的时候找出最大值之后求差判断即可

代码

#include <bits/stdc++.h>
using namespace std;
main()
{
	int a1,b1,c1;
	cin>>a1>>b1>>c1;
	int ans1,ans2,ans3;
	int n;	
	cin>>n;
	while(n--)
	{
		int n1,n2,n3;
		cin>>n1>>n2>>n3;
		ans1=max(ans1,n1);
		ans2=max(ans2,n2);
		ans3=max(ans3,n3);
	}
	(ans1-a1>0)?cout<<ans1-a1:cout<<0;
	cout<<" ";
	(ans2-b1>0)?cout<<ans2-b1:cout<<0;
	cout<<" ";
	(ans3-c1>0)?cout<<ans3-c1:cout<<0; 	
} 

E.DQ数球

标准的队列模拟题,直接用队列模拟即可,把经过的球放到队尾,数到的球踢出队列即可

代码

#include <bits/stdc++.h>
using namespace std;
main()
{
    int n;
    while(cin>>n)
    {
    	queue<int> q;
		for(int i=1;i<=n;i++)
    	q.push(i);
    	while(1)
    	{
        	if(q.size()==1)
        	{
        	    cout<<q.front()<<endl;
        	    break;
        	}
        	for(int i=0;i<2;i++)
        	{
            	int t=q.front();
            	q.pop();
            	q.push(t);  
        	}
        	q.pop(); 
    	}
    }
}

F.环形求和

最大子序列和的翻版问题设置两个变量sum和id,sum用来记录最大值,id用来记录下标。然后循环里面的t用来记录一次要加多少的数

代码

#include <bits/stdc++.h>
using namespace std;
int num[105];
main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>num[i];
    for(int i=n+1;i<n+4;i++)
    num[i]=num[i-n];
    int ans=0;int id=1;
    for(int i=1;i<=n;i++)
    {
        int sum=0;
		for(int j=i;j<=i+3;j++)
        sum+=num[j];
        if(sum>ans)
        {
        	ans=sum;
        	id=i;
		}
    }
    cout<<ans<<endl<<id;
}

G.数字换位

直接转换成字符串倒叙输出即可

代码

#include <bits/stdc++.h>
using namespace std;
main()
{
	string a;
	cin>>a;
	reverse(a.begin(),a.end());
	cout<<a;
}

H.数字统计

还是直接转换成字符串硬解统计即可

代码

#include <bits/stdc++.h>
using namespace std;
main()
{
	int L,R;
	cin>>L>>R;
	int sum=0;
	for(int i=L;i<=R;i++)
	{
		stringstream s;
		s<<i;
		string ss;
		s>>ss;
		for(int i=0;i<ss.size();i++)
		if(ss[i]=='2')
		sum++;
	}
	cout<<sum;
}