第一题
思想
维护三个最小变量 a1 a2 a3
把每个输入进来的值与这三个变量进行对比。类似滚动数组。
有这样一个图:
if 当x<=a1小时,那么x就会成为新的a1(即成为新的最小值)
但是要从后面开始挪,a2到a3位置上成为新a3,a1挪a2位置上成新a2`。
再把x挪a1位置上成为新a1.
挪完之后如图(a-1):
else if x<=a2小比a1大的时候,那么就把x放到a2的位置作为 第二小
else if x<=a3小 比a1,a2大的时候,就把x放到a3的位置上作为 第三小 。
因为题目要求第三小,所以最后返回a3即可。
code
#include <iostream>
using namespace std;
int main()
{
int n=0;
int a1=1000000000,a2=1000000000,1000000000;
int x=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x;
if(x<=a1)
{
a3=a2;
a2=a1;
a1=x;
}
else if(x<=a2)
{
a3=a2;
a2=x;
}
else if(x<=a3)
{
a3=x;
}
if(i>=2)
{
cout<<a3<<" ";
}
}
return 0;
}
第二题
一次性把数据全部输入,然后套题目给的公式就可以了
套完公式求出尖位置最大程度之后,把最大程度给 一个变量max,接下来维护这个max就行了,max装的就是最大值。
#include <iostream>
using namespace std;
int n=0;
int a[1003];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int max=0; int t=0;
for(int i=0;i<n;i++)
{
if(a[i-1]>a[i]&&a[i]<a[i+1])
{
t= (a[i-1]-a[i])*(a[i+1]-a[i]);
if(t>max)
max=t;
}
}
cout<<max<<endl;
return 0;
}
第三题
#include <iostream>
using namespace std;
const int N=100000;
int cnt[12];
char s[N];
int main()
{
cin>>s;
for(int i=0;s[i];i++)
{
cnt[s[i]-'0']++;
}
for(int i=0;i<10;++i)
{
cout<<cnt[i]<<" ";
}
return 0;
}
第四题
最小数位和【省模拟赛】 - 蓝桥云课 (lanqiao.cn)
思想
题目给了 8行8列个二进制数据,要求 求`最小和`
我们把8行8列的数据输入,然后用位运算把每一位拆分出来,再相加得到 `相加和`。
再设一个`最小和`,`最小和`要小于题目给的数据的值。
然后拿`相加和` 与 `最小和` 作对比。 如果`相加和`更小,那么`相加和`就变为新的`最小和`。
code
#include<iostream>
using namespace std;
int main()
{
//根据题目给的数据,我们可以设一个最小和,只要这个最小和比题目给的数据的值都小就行,可以设100000
int nowmin=0,nowminsum=100000,x,t,sum;
t=x;
for(int i=0;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
cin>>x;
sum+=t%10;
t/=10;
//如果sum比nomimsum小
if(sum<nowminsum)
{
nowminsum=sum;//,那么sum就是最新的nowminsum
//把下一个数给nowmin
nowmin=x;
}
}
}
cout<<nowmin<<endl;
return 0;
}
怎么把数据输入
把题目给的这8*8个数据写入一个文件,文件命名为1:
然后我们把 1输入重定向到 test.c里面,test.c就会把这个数据拿来用,然后就可以求出最小和:
把这个答案填上去就可以了。