人们都知道,蓝桥杯B组就是暴力比赛。。。
试题 A: 空间
1GB=1024MB 1MB=1024KB 1KB=1024B 1B=8b(位)
答案:67108864
cout<<256*1024*1024/4;
试题 B: 卡片
0-9每个都有2021张,记录每一张的剩余个数,然后从1开始枚举,知道卡片不够用结束,输出当前数字-1。
答案:3181
int main() {
map<int,int>x;
for(int i=0;i<=9;i++)x[i]=2021;
for(int i=1;;i++){
int n=i;
while(n){
if(x[n%10]==0){
cout<<i-1<<endl;
return 0;
}
x[n%10]--;
n/=10;
}
}
}
试题 C: 直线
斜率与截距确定一条直线,枚举出所有的直线,相差超过1e-8 (10^ -8)就不是同一条直线了。
答案:40257
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 200000;
int n;
struct Line
{
double k, b;
bool operator< (const Line& t) const
{
if (k != t.k) return k < t.k;
return b < t.b;
}
}l[N];
int main()
{
for (int x1 = 0; x1 < 20; x1 ++ )
for (int y1 = 0; y1 < 21; y1 ++ )
for (int x2 = 0; x2 < 20; x2 ++ )
for (int y2 = 0; y2 < 21; y2 ++ )
if (x1 != x2)
{
double k = (double)(y2 - y1) / (x2 - x1);
double b = y1 - k * x1;
l[n ++ ] = {k, b};
}
sort(l, l + n);
int res = 1;
for (int i = 1; i < n; i ++ )
if (fabs(l[i].k - l[i - 1].k) > 1e-8 || fabs(l[i].b - l[i - 1].b) > 1e-8)
res ++ ;
cout << res + 20 << endl;
return 0;
}
试题 D: 货物摆放
就是找3个数乘积得2021041820210418 的个数,根据题目可以发现,三个数都是当前数的约数,所以,先找出所有的约数,再枚举就行了。
答案:2340
int main() {
set<ll>a;
ll n=2021041820210418;
for(ll i=1; i*i<=n; i++)
if(n%i==0) {
a.insert(i);
a.insert(n/i);
}
int res=0;
for(auto i:a)
for(auto j:a)
for(auto k:a)
if(i*j*k==n)res++;
cout<<res;
}
试题 E: 路径
简单的最短路,利用Floyd -- Dijkstra... 都可,因为是只提交答案,所以就用Floyd 了
答案:10266837
int a[2025][2025];
int main() {
for(int i=1;i<=2021;i++){
for(int j=1;j<=2021;j++){
if(abs(i-j)>21)
a[i][j]=a[j][i]=0x3f3f3f3f;
else {
a[i][j]=a[j][i]=i*j/__gcd(i,j);
}
}
}
for(int k=1;k<=2021;k++){
for(int i=1;i<=2021;i++){
for(int j=1;j<=2021;j++)
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
}
}
cout<<a[1][2021];
}
试题 F: 时间显示
注意:1s=1000ms 一天86400s 对86400求余即可
答案:
int main() {
ll n;
cin>>n;
n/=1000;
n%=86400;
printf("%02d:%02d:%02d",n/3600,n%3600/60,n%3600%60);
}
试题 G: 砝码称重
不会DP就暴力求解 暴力二进制枚举 拿一半分
暴力枚举:
int main() {
int n;cin>>n;
int res=0;
set<int>b;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<1<<n;i++){
int sum=0;
for(int j=0;j<n;j++){
if(i&(1<<j)){
sum+=a[j];
}
}
if(sum>0)b.insert(sum);
for(int j=0;j<n;j++){
if(sum-a[j]>0)
b.insert(sum-a[j]);
}
}
cout<<b.size()<<endl;
}
满分DP做法:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110, M = 200010, B = M / 2;
int n, m;
int w[N];
bool f[N][M];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]), m += w[i];
f[0][B] = true;
for (int i = 1; i <= n; i ++ )
for (int j = -m; j <= m; j ++ )
{
f[i][j + B] = f[i - 1][j + B];
if (j - w[i] >= -m) f[i][j + B] |= f[i - 1][j - w[i] + B];
if (j + w[i] <= m) f[i][j + B] |= f[i - 1][j + w[i] + B];
}
int res = 0;
for (int j = 1; j <= m; j ++ )
if (f[n][j + B])
res ++ ;
printf("%d\n", res);
return 0;
}
试题 H: 杨辉三角形
20%还是可以拿的。。。。
int main(){
int c[52]={0,1,5,8,12,17,13,30,38,47,18};
int n;
cin>>n;
cout<<c[n];
}
试题 I: 双向排序
自定义sort排序 暴力做
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<set>
const double pi=3.14159265358979323846;
typedef long long ll;
using namespace std;
int a[5005];
bool cmp1(int a,int b){
return a<b;
}
bool cmp2(int a,int b){
return a>b;
}
int main() {
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)a[i]=i;
while(m--){
int x,y;
cin>>x>>y;
if(x==1){
sort(a+y,a+n+1,cmp1);
}
else {
sort(a+1,a+1+y,cmp2);
}
}
for(int i=1;i<=n;i++)cout<<a[i]<<" ";
}
试题 J: 括号序列
|