您的位置:首页 > 其它

2018年蓝桥杯整理

2020-04-05 18:24 162 查看

分数

1.快速幂
2.最大公约数

#include<iostream>
using namespace std;
long  pow_2(int b){
long x=2;
long res=1;
while(b>0){
if(b&1) res*=x;
b>>=1;
x=x*x;
}
return res;
}
int gcd(long a,long b){
if(b==0) return a;
return gcd(b,a%b);
}
int main(){
cout<<gcd(pow_2(20)-1,pow_2(19))<<endl;
cout<<pow_2(20)-1<<"/"<<pow_2(19);
}

乘积尾零

1.零来自5*2,所以只要统计2和5的个数

#include<iostream>
using namespace std;
int main(){
int data[]={5650,4542,3554,473,946,4114,3871,9073,90,4329
,2758, 7949 ,6113, 5659, 5245 ,7432, 3051 ,4434, 6704 ,3594
,9937, 1173 ,6866, 3397, 4759 ,7557, 3070 ,2287 ,1453 ,9899
,1486, 5722 ,3135, 1170, 4014, 5510, 5120, 729 ,2880 ,9019
,2049, 698 ,4582 ,4346 ,4427 ,646 ,9742 ,7340, 1230 ,7683
,5693, 7015 ,6887, 7381, 4172, 4341, 2909 ,2027, 7355, 5649
,6701, 6645 ,1671, 5978, 2704, 9926, 295 ,3125, 3878, 6785
,2066, 4247 ,4800, 1578, 6652, 4616, 1113 ,6205, 3264 ,2915
,3966, 5291 ,2904, 1285, 2193, 1428, 2265, 8730, 9436, 7074
,689 ,5510 ,8243 ,6114 ,337, 4096 ,8199, 7313 ,3685, 211};
int c2=0,c5=0;
for(int i=0;i<100;i++){
int num=data[i];
while(num%2==0){
c2++;
num/=2;
}
while(num%5==0){
c5++;
num/=5;
}
}
// cout<<c2<<" "<<c5<<endl;
cout<<min(c2,c5)<<endl;
return 0;
}

第几个幸运数

1.和素数筛法相似
2.利用set排序与去重

#include<iostream>//生成法,set
#include<set>
using namespace std;
typedef long long ll;
const ll maxn=59084709587505;
int main(){
int a[3]={3,5,7};
ll tou=1;
set<ll> s;
while (true){
for(int i=0;i<3;i++){
ll tt=tou*a[i];//t分别乘以3,5,7
if(tt<=maxn) s.insert(tt);
}
tou=*(s.upper_bound(tou));//从set中选择比tou大的最小数
if(tou>=maxn) break;
}
cout<<s.size()<<endl;
return 0;
}

航班时间

1.处理输入
2.发现规律

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int T;
int getTime(){
char line[100]={};
cin.getline(line,100);
int h1,m1,s1,h2,m2,s2,d=0;
if(strlen(line)==17){
sscanf(line,"%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
}
else sscanf(line,"%d:%d:%d %d:%d:%d (+%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d);
int time=d*24*3600+h2*3600+m2*60+s2-h1*3600-m1*60-s1;
return time;
}
int main()
{
(cin>>T).get();
/*for(int i=0;i<T;i++){
char line[100]={};
cin.getline(line,100);
int h1,m1,s1,h2,m2,s2,d=0;
if(strlen(line)==17){
sscanf(line,"%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
}
else sscanf(line,"%d:%d:%d %d:%d:%d (+%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d);
int time1=d*24*3600+h2*3600+m2*60+s2-h1*3600-m1*60-s1;
//
cin.getline(line,100);
if(strlen(line)==17){
sscanf(line,"%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
}
else sscanf(line,"%d:%d:%d %d:%d:%d (+%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d);
int time2=d*24*3600+h2*3600+m2*60+s2-h1*3600-m1*60-s1;
//
*/
for(int i=0;i<T;i++){
int time1=getTime();
int time2=getTime();
int t=(time1+time2)/2;
printf("%02d:%02d:%02d\n",t/3600,t/60%60,t%60);
}
return 0;
}

全球变暖

#include<iostream>//宽搜连通块
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
using namespace std;
int N,ans;//分别为:规模,答案
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
char data[1000][1000];
int mark[1000][1000];
struct Point{
int x,y;
};
void bfs(int i,int j){
mark[i][j]=1;//标记
queue<Point> q;
q.push({i,j});
int cnt1=0,cnt2=0;//记录#的数量与.相邻
while(!q.empty()){
Point first=q.front();
q.pop();
cnt1++;
bool swed=false;//标记弹出#四周是否有.
for(int k=0;k<4;k++){
int x=first.x+dx[k];
int y=first.y+dy[k];
if(0<=x&&x<N&&0<=y&&y<N&&data[x][y]=='.') swed=true;
if(0<=x&&x<N&&0<=y&&y<N&&data[x][y]=='#'&&mark[x][y]==0){
q.push({x,y});
mark[x][y]=1;
}
}
if(swed) cnt2++;
}
if(cnt1==cnt2) ans++;
}
void work(){
//快读
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>N;//读取规模
char next;
cin.get(next);
while(next!='\n') cin.get(next);
for(int i=0;i<N;i++){
for(int j=0;j<N;j++)
cin.get(data[i][j]);
//读取换行符
while(next!='\n') cin.get(next);
}
//双循环检验#
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(mark[i][j]==0&&data[i][j]=='#')
{
bfs(i,j);
}
}
}
cout<<ans<<endl;
}
int main(){
int ago=clock();
work();
clog<<"运行时间"<<clock-ago<<endl;
return 0;
}

三体攻击

1模拟
2.效率较低

#include<iostream>
#include<cstring>
using namespace std;
int A,B,C,m,a,b,c;
int getInt(){//快读
char ch=getchar();
int x=0,f=1;
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline int getIndex(int x,int y,int z){
return ((x-1)*b+(y-1))*c+z;
}
int main(){
A=getInt();
B=getInt();
C=getInt();
m=getInt();
a=A+1,b=B+1,c=C+1;
int *data=new int[a*b*c];
int (*atk)[7]=new int[m+1][7];
for(int i=1;i<=A;i++)
for(int j=1;j<=B;j++)
for(int k=1;k<=C;k++)
data[getIndex(i,j,k)]=getInt();
//
for(int i=1;i<=m;i++){
for(int j=0;j<7;j++){
atk[i][j]=getInt();
}
//执行攻击
for(int x=atk[i][0];x<=atk[i][1];x++)
for(int y=atk[i][2];y<=atk[i][3];y++)
for(int z=atk[i][4];z<=atk[i][5];z++){
data[getIndex(x,y,z)]-=atk[i][6];
if(data[getIndex(x,y,z)]<0){
cout<<i<<endl;
delete []data;
delete []atk;
return 0;
}
}
}
delete []data;
delete []atk;
return 0;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
小熊迪帝 发布了12 篇原创文章 · 获赞 0 · 访问量 171 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: