目录
[蓝桥杯 2022 省 A] 求和
题目描述
输入 #1
4
1 3 6 9
样例输出 #1
117
解题思路:我们拿到这个题我们可以两个for循环结束这个题!不过我们可以思考更深层次的东西!比如将有规律的几组乘积合并!仔细看就能发现每个数都是乘上以他为某一个乘数的乘上以他开始的后面所有数的总和,因此我们可以每次算哪个数的总乘积,可以先把它减掉,然后在乘起来!
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,i,a[200005];
long long sum = 0,ans = 0;
cin>>n;
for(i = 0;i<n;i++){
cin>>a[i];
ans +=a[i];
}
for(i = 0;i<n-1;i++){
ans -= a[i];
sum += a[i]*ans;
}
cout<<sum<<endl;
return 0;
}
[蓝桥杯 2019 省 B] 特别数的和
题目描述
输入 #1
40
输出 #1
574
思路
没什么好说的,一眼就是暴力直接秒了。代码如下:
#include <bits/stdc++.h>
using namespace std ;
typedef long long LL;
int n;
LL ans = 0;
bool check(int x) {
while(x) {
int t = x % 10;
if(t==2||t==0||t==1||t==9) {
return true;
}
x /= 10;
}
return false;
}
int main () {
cin >> n;
for (int i = 1; i <= n; i ++) {
if(check(i)) {
ans += i;
}
}
cout << ans << endl;
return 0;
}
[蓝桥杯 2023 省 A] 填空问题
题目描述
思路:直接暴力枚举即可,因为可以在本地跑,没有限时:一答案为:4430091。
思路:二答案:8335366
1.f(i,j)表示前 i 题得分为 j 的方案。
2.状态转移方程,分答对了和答错了。
3.初始化,根据定义 f(0,0)=1
4.递推。
最终题解:
#include<stdio.h>
int main()
{
char c = getchar();
if(c == 'A')
printf("4430091");
else
printf("4165637");
return 0;
}
[蓝桥杯 2020 省 AB1] 走方格
题目描述
输入 #1
3 4
输出 #1
2
思路:动态规划的典型题目类型,按照动态思路求解:
#include<iostream>
using namespace std;
int main()
{
int dp[33][33]={0};
dp[1][1]=1;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(i==1&&j==1) continue;
if(i%2||j%2)
{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
cout<<dp[n][m]<<endl;
}
题目背景
小明正在玩一个“翻硬币”的游戏。
思路:
因为输入的是字符串所以定义char类型的数组来存储。
主函数部分可以这样想,输入两个由o*组成的字符串,取得a字符串的长度,定义一个循环变量用来遍历整个a数组,通过a数组与b数组的比较可知哪里不同,那么直接替换即可,最后在循环中用i变量来计数
我的做法是直接递归搜索,如果翻转之后的位置k,s[0]到s[k]的情况都成立,那么向下递归让k+1,翻转数+1,否则恢复翻转之前的状态,k+1,翻转数不变。出口:如果k等于s的长度,那么字符串翻转后的结果满足要求,返回翻转数。
#include <bits/stdc++.h>
using namespace std;
int main(){
char a[1001];
char b[1001];
cin>>a>>b;
int len=strlen(a);
int i=0,sum=0;
while(i<len){
if(a[i]!=b[i]){
a[i+1]=(a[i+1]=='*'?'o':'*');
sum++;
}
i++;
}
cout<<sum;
return 0;
}
[蓝桥杯 2017 省 AB] 分巧克力
题目描述
思路:可以将其抽象成小于可行,大于不可行的二分问题。
在判断时,遍历全部巧克力,每个巧克力分割成的小巧克力数相加。分割成的小巧克力数目的计算方式为,高整除枚举到的x,宽整除枚举到的x的乘积。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n, k, mx = 0;
int h[N], w[N];
bool check (int x) {
int res = 0;
for (int i = 1;i <= n;i ++)
res += (h[i] / x) * (w[i] / x);
return res >= k;
}
int main()
{
cin >> n >> k;
for (int i = 1;i <= n;i ++)
cin >> h[i] >> w[i],
mx = max (mx, max(h[i], w[i]));
int l = 1, r = mx, mid;
while (l < r) {
mid = l + r + 1 >> 1;
if (check (mid)) l = mid;
else r = mid - 1;
}
cout << l << endl;
return 0;
}
[蓝桥杯 2016 省 B] 交换瓶子
题目描述
核心步骤:
例如A[3]={2,0,1},2在0的位置,0在1的位置,1在2的位置,那么把它们画成图的拓扑结构的话,就是一个环(圈),即2->0->1->2。
这样的条件(排列成环(圈))用文字描述为:
1、位置和位置上的数字或字符存在一一对应关系;
2、每个数字或字符都不在自己应有的位置上;
题目要求计算:至少交换多少次
每交换一次,就是这个环内分解为两个独立的环
那么我们先计算出环的个数,最后得到排列好的就是每个独立的环,答案就是总个数 - 环的个数
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
int n;
int a[N];
int len,ans;
bool st[N];
void dfs(int u){
if(st[u]) return ;
st[u] = true;
dfs(a[u]);
}
int main(){
cin >> n;
for(int i = 1; i <= n; i ++ ) cin >> a[i];
for(int i = 1; i <= n; i ++ ){
if(!st[i]){
ans ++;
dfs(i);
}
}
cout<<n - ans;
return 0;
}