蓝桥杯每日真题
宝石组合(√);
第十二届蓝桥杯B组省赛真题
1.
空间
//1 MB = 1024 KB
1 KB =1024B
1 B = 8 b;
#include <iostream>
using namespace std;
int main()
{
long long num = 256*1024*1024/4;
cout<<num;
return 0;
}
2.
货物摆放
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int n=2021041820210418;
int ans=0;
int nums[100005];
int num=0;
for(int i=1;i<=sqrt(n);i++)
{
if(n%i==0)
{
nums[ans++]=i;
if(i*i!=n)
{
nums[ans++]=n/i;
}
}
}
for(int a=0;a<ans;a++)
{
for(int b=0;b<ans;b++)
{
for(int c=0;c<ans;c++)
{
if(nums[a]*nums[b]*nums[c]==n)
{
num++;
}
}
}
}
cout<<num;
return 0;
}
3.
时间显示
#include <iostream>
using namespace std;
#define int long long
signed main()
{
int n;
cin>>n;
n/=1000;
int s=n/60/60%24;
int f=n/60%60;
int m=n%60;
int a=s/10;
int b=s%10;
int x=f/10;
int y=f%10;
int c=m/10;
int d=m%10;
cout<<a<<b<<":"<<x<<y<<":"<<c<<d;
return 0;
}
4.
杨辉三角(30%,超时)正解:二分
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1005;
int dp[N][N];
signed main()
{
int num;
cin>>num;
dp[0][0]=1;
int ans=1;
for(int i=1;i<10000;i++)
{
for(int j=0;j<=i;j++)
{
if(j==0||j==i)
{
dp[i][j]=1;
ans++;
}
else
{
dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
ans++;
}
if(dp[i][j]==num)
{
cout<<ans;
return 0;
}
}
}
}
5.
双向排序(60%,超时)正解:线段树
#include <bits/stdc++.h>
using namespace std;
bool up(int a,int b)
{
return a<b;
}
bool down(int a,int b)
{
return a>b;
}
int main()
{
int n,m;
cin>>n>>m;
int num[n];
int a,b;
for(int i=0;i<n;i++)
{
num[i]=i+1;
}
for(int i=0;i<m;i++)
{
cin>>a>>b;
if(a==0)
{
sort(num,num+b,down);
}
if(a==1)
{
sort(num+b-1,num+n,up);
}
}
for(int i=0;i<n;i++)
{
cout<<num[i]<<" ";
}
return 0;
}
6.
卡片
#include <iostream>
using namespace std;
int main()
{
int i;
int arr[10];
for(i=0;i<10;i++){
arr[i]=2021;//记录0-9这10张卡片的数量,开始都是2021张
}
for(i=1;;i++){//由于不知道到i的边界值,省略,会一直执行
int x=i; //用x来存放每一个i的值,防止i值的改变
while(x){
if(arr[x%10]==0){//当有一张卡片的数量剩余为0张的时候,输出前一个i的值,也就是i-1,并退出
cout<<i-1;
exit(0);
}
arr[x%10]--; //每一张卡片数量减少1
x/=10;
}
}
return 0;
}