2018蓝桥杯省赛B组
2018蓝桥杯省赛B组
6.第几天

#include <iostream>
using namespace std;
int main()
{cout<<125;
// 请在此输入您的代码
return 0;
}
计算:
31+29+31+30+4=125
计算的代码
#include<bits/stdc++.h>
using namespace std;
int ans;
int main()
{
int m[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//考:每个月天数的表示
int y1=1;
int r1=1;
int y2=5;
int r2=4;
while(!((y1==y2)&&(r1==r2))){
r1++;
if(r1>m[y1]){
r1=1;
y1++;
}
ans++;
}
cout<<ans+1;
// 请在此输入您的代码
return 0;
}
A.明码

//第一步弄清楚这段文字是什么这是个汉字
#include<bits/stdc++.h>
using namespace std;
void two(int i,string&a){
//对于一个整数化成8位二进制,范围-128~127,对于正数最高位在二进制中是0也就是默认的-,对于负数最高位是1
if(i>=0){
for(int j=0;j<7;j++){
if((i>>j)&1==1){
a[8-j-1]='1';
}
}
}
else{//负数
a[0]='1';
for(int j=0;j<7;j++){
if(((128+i)>>j)&1==1){
a[8-j-1]='1';
}
}
}
}
int main(){
/*解析:题目中说有十个汉字,刚好十行,一行一个汉字!然后 一个汉字十六行,一行2个字节,所以一个汉字32个字节,刚好一行32个整数,所以一个整数
表示1个字节,所以我们的任务是将每个汉字的字形先输出按照一行两字节(2个整数-->化成2进制)一个汉字16行,然后通过汉字读懂题最后输出答案。
关键:将任意整数化成二进制
怎么看:1为墨迹要看的,-不管
*/
for(int i=0;i<10;i++){//10个整数
for(int j=0;j<16;j++){//1个整数16行,1行两字节(2个是十进制整数)
int x,y;
cin>>x>>y;
//先默认一行的两字节,等会儿只用看哪一位化成二进制是1,如果是0就不用变还是-
string a="--------";
string b="--------";
two(x,a);
two(y,b);
cout<<a+b<<endl;
}
cout<<"====================================================";//下一个汉字
}
return 0;
}
//第二步计算要提交的答案-->上面文字为9的9次方等于多少?
#include<bits/stdc++.h>
using namespace std;
int main(){
long long int ans=1;
for(int i=0;i<9;i++){
ans*=9;
}
cout<<ans;
return 0;
}
//填空题只用提交答案
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"387420489 ";
return 0;
}
考点:
读懂题-->确定是考察化整数为二进制
化成二进制模版
void two(int i,string&a){
//对于一个整数化成8位二进制,范围-128~127,对于正数最高位在二进制中是0也就是默认的-,对于负数最高位是1
if(i>=0){
for(int j=0;j<7;j++){
if((i>>j)&1==1){
a[8-j-1]='1';
}
}
}
else{//负数i和正数128+i只有最高位不同
a[0]='1';
for(int j=0;j<7;j++){
if(((128+i)>>j)&1==1){
a[8-j-1]='1';
}
}
}
}
B.乘积尾零

考点:
有点类似于试除法求约数
对于末尾为0可以考虑成2*5=10所以只需要计算所有输入的数可以分解成几个2几个5先分解2分解5都行,然后取因数为2,5个数最少的那个。
#include<bits/stdc++.h>
using namespace std;
int main(){
int p[200];
for(int i=0;i<100;i++){
cin>>p[i];
}
int a=0;//有多少个2为因子
int b=0;
for(int i=0;i<100;i++){
int k=p[i];
while(k%2==0){
a++;
k/=2;
}
while(k%5==0){
b++;
k/=5;
}
}
cout<<min(a,b);
return 0;
}
递增三元组

考点:
1.stl二分
lower_bound( )//大于等于
upper_bound( )//大于
用法:
利用二分查找stl必须保证数组有序
1.查找第一个大于等于这个数
(1)得第一个大于等于这个数的数字下标
lower_bound(数组名+查找起点,数组名+查找终点+1,查找数)-数组名
(2)返回指向大于等于这个数的第一个数字的指针
lower_bound(数组名+查找起点,数组名+查找终点+1,查找数)
(3)返回指向大于等于这个数的第一个数字的指针
*lower_bound(数组名+查找起点,数组名+查找终点+1,查找数)
2.查找第一个大于这个数
(1)得第一个大于这个数的数字下标
upper_bound(数组名+查找起点,数组名+查找终点+1,查找数)-数组名
(2)返回指向大于这个数的第一个数字的指针
upper_bound(数组名+查找起点,数组名+查找终点+1,查找数)
(3)返回指向大于这个数的第一个数字的指针
*upper_bound(数组名+查找起点,数组名+查找终点+1,查找数)
例如:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[5]={1,3,5,9,19};
cout<<*upper_bound(a,a+5,5);
return 0;
}
2.关键:
要将中间b数组作为参照,a数组中取比他小的有x个,c数组中取比他大有y个,那对于当前b中这个元素满足条件三元组有x*y个。
要乘法和stl否则超时
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
int a[N];
int b[N];
int c[N];
int main(){
int n;
cin>>n;
//1.输入a,b,c数组
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
cin>>b[i];
}
for(int i=0;i<n;i++){
cin>>c[i];
}
//2.排序
sort(a,a+n);
sort(b,b+n);
sort(c,c+n);
long long int ans=0;//答案怕太大所以long long
//3.以b做参考
for(int i=0;i<n;i++){
//(1)第一个比b[i]大于等于的a中数的下标(我们不要的)也是比b[i]小的a里面数的个数
int x=lower_bound(a,a+n,b[i])-a;
//(2)第一个比b[i]大于的c中数的下标(我们要的)
int y=n-(upper_bound(c,c+n,b[i])-c);
ans+=x*y;
}
cout<<ans;
return 0;
}