目录
2024/9/14:7.好数 - 蓝桥云课 (lanqiao.cn)
2024/9/15:10.R 格式 - 蓝桥云课 (lanqiao.cn)
2024/9/16:0合根植物 - 蓝桥云课 (lanqiao.cn)
2024/9/17:1.数字接龙 - 蓝桥云课 (lanqiao.cn)
2024/9/18:5.回文日期 - 蓝桥云课 (lanqiao.cn)
2024/9/19:13.货物摆放 - 蓝桥云课 (lanqiao.cn)
2024/9/20:14.杨辉三角形 - 蓝桥云课 (lanqiao.cn)
2024/9/21:1.路径之谜 - 蓝桥云课 (lanqiao.cn)
2024/9/22:9.等差素数列 - 蓝桥云课 (lanqiao.cn)
2024/9/23:18.修建公路1 - 蓝桥云课 (lanqiao.cn)
2024/9/24:4.蓝桥幼儿园 - 蓝桥云课 (lanqiao.cn)
2024/9/25:OpenJudge - 8462:大盗阿福
2024/9/28:2.数字三角形 - 蓝桥云课 (lanqiao.cn)
2024/9/27:1.数字三角形 - 蓝桥云课 (lanqiao.cn)
2024/9/28:4.跳跃 - 蓝桥云课 (lanqiao.cn)
2024/9/29:9.卡片 - 蓝桥云课 (lanqiao.cn)
2024/9/30:1.小明的背包1 - 蓝桥云课 (lanqiao.cn)
2024/10/1:2.小明的背包2 - 蓝桥云课 (lanqiao.cn)
代码模板
#include <bits/stdc++.h>
#define int long long
#define PII pair<int, int>
#define LL _int128
using namespace std;
const int N=2e5+10, M=1e3+10;
int A[N], pre[N];
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
return 0;
}
2024/9/14:7.好数 - 蓝桥云课 (lanqiao.cn)
考点:暴力
#include <bits/stdc++.h>
#define ll long long
using namespace std;
/*
问题描述
一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位)上的数字是奇
数,偶数位 (十位、千位、十万位) 上的数字是偶数,我们就称之为"好数"。
给定一个正整数N,请计算从1到N一共有多少个好数。
*/
bool judge(ll num);
int ans=0;
int main() {
ll N;
cin>>N;
for(ll i=1; i<=N; i++) {
if(judge(i)) {
ans++;
}
}
cout<<ans;
return 0;
}
bool judge(ll num) {
int cnt=0;
while(num>0) {
if(cnt%2==0 && num%10%2==0) {
return false;
} else {
num/=10;
cnt++;
}
if(cnt%2==1 && num%10%2==1) {
return false;
} else {
num/=10;
cnt++;
}
}
return true;
}
2024/9/15:10.R 格式 - 蓝桥云课 (lanqiao.cn)
考点:高精度,模拟,高精度*低精度乘法
1、暴力骗分(50%的得分)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int n;
double d;
cin>>n>>d;
double ans;
ans=round(ans=d*pow(2,n));
printf("%.0lf", ans);
return 0;
}
2、标准解法
#include <bits/stdc++.h>
#define ll long long
#define N 2010
using namespace std;
string s;
int a[N];
int main()
{
int n;
cin>>n>>s;
reverse(s.begin(), s.end());
int pos=s.find(".");
s.erase(pos, 1);
int len=s.size();
for(int i=0; i<len; i++) {
a[i+1]=s[i]-'0';
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=len; j++) {
a[j]*=2;
}
for(int j=1; j<=len; j++) {
if(a[j]>=10) {
a[j+1]++;
a[j]%=10;
if(j==len) {
len++;
}
}
}
}
if(a[pos]>=5) {
a[pos+1]++;
}
for(int i=len; i>=pos+1; i--) {
cout<<a[i];
}
return 0;
}
2024/9/16:0合根植物 - 蓝桥云课 (lanqiao.cn)
考点:并查集
#include <bits/stdc++.h>
#define ll long long
const int N=1e6+10;
using namespace std;
ll fa[N], size[N], pre[N];
void init() {
//初始化father数组
for(int i=0; i<N; i++) {
fa[i]=i;
}
}
int find(int i) {
if(fa[i]==i) {
//i的根找到,返回其根的序号
return i;
}
return fa[i]=find(fa[i]);//否则就递归直到找到根
}
bool isSameRoot(int x, int y) {
return find(x)==find(y);
}
void union_(int x, int y) {
//合并两个集合
if(!isSameRoot(x, y)) {
//x所在的集合的根改为y集合所在的根
fa[find(x)]=find(y);
}
}
int main()
{
ll m, n, k;
cin>>m>>n>>k;
init();
while(k--) {
int a, b;
cin>>a>>b;
union_(a, b);
}
int ans=0;//连通分量
//for遍历查看一共有几个不同的分量
for(int i=0; i<m*n; i++) {
if(find(i)==i) {
ans++;
}
}
cout<<ans;
return 0;
}
2024/9/17:1.数字接龙 - 蓝桥云课 (lanqiao.cn)
考点:dfs,迷宫问题
#include <bits/stdc++.h>
#define ll long long
const int N=20;
int a[N][N], path[N*N];
bool vis[N][N];//标记
int n, k, f=0;
//75%的测试案例
//方向数组
int dx[]= {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[]= {0, 1, 1, 1, 0, -1, -1, -1};
using namespace std;
void dfs(int x, int y, int dep) {
if(f) return;
if(x==n && y==n && dep==n*n-1) {//n*n代表走过每一个点
f=1;
for(int i=0; i<dep; i++) {
cout<<path[i];
}
return ;
}
for(int i=0; i<8; i++) {
int bx=x+dx[i], by=y+dy[i];
if(bx<1 || bx>n || by<1 || by>n || vis[bx][by] ||
!(a[x][y]==k-1 && a[bx][by]==0 || a[bx][by]==a[x][y]+1)) {//越界和已访问,满足0,1,2,… ,k-1的序列
continue;
}
//防止路径交叉
if(i==1 && vis[x-1][y] && vis[x][y+1]) continue;
else if(i==3 && vis[x+1][y] && vis[x][y+1]) continue;
else if(i==5 && vis[x+1][y] && vis[x][y-1]) continue;
else if(i==7 && vis[x-1][y] && vis[x][y-1]) continue;
vis[bx][by]=1;
path[dep]=i;
dfs(bx, by, dep+1);
vis[bx][by]=0;
}
}
int main() {
cin>>n>>k;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
cin>>a[i][j];
}
}
vis[1][1]=1;
dfs(1, 1, 0);
if(!f) cout<<-1;
return 0;
}
2024/9/18:5.回文日期 - 蓝桥云课 (lanqiao.cn)
考点:模拟
#include <bits/stdc++.h>
//90%的案例,89991231不通过,应该是数据量太大,优化方案:遍历日期的前四位,判断是否为回文日期
#define ll long long
#define N 89991231+100
using namespace std;
int month[13]= {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool isLeapYear(int date) {
return (date%400 || date%4 && date%100!=0);
}
int main() {
int D=20200202;
cin>>D;
int A, B;
int date=0;
bool flag=false;
for(ll i=D; i<N; i++) {
int y1, y2, y3, y4, m1, m2, d1, d2;
y1=i/10000000;
y2=i/1000000%10;
y3=i/100000%10;
y4=i/10000%10;
m1=i/1000%10;
m2=i/100%10;
d1=i/10%10;
d2=i%10;
if(isLeapYear(i%10000)) {
month[2]=29;
} else {
month[2]=28;
}
if(m1*10+m2>12 || m1*10+m2<0 || i%100>month[m1*10+m2]) {
continue;
}
if(y1==d2 && y2==d1 && y3==m2 && y4==m1 && i>D && flag==false) {
cout<<i<<endl;
flag=true;
}
if(y1==y3&&y1==m2&&y1==d2 && y2==y4&& y2==m1&&y2==d1 && i>D) {
cout<<i;
return 0;
}
}
return 0;
}
2024/9/19:13.货物摆放 - 蓝桥云课 (lanqiao.cn)
考点:枚举,暴力
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll n=2021041820210418;
vector<ll> arr;//存储约束
int main()
{
//求约数
int cnt=0;
for(ll i=1; i*i<=n; i++) {
if(n%i==0) {
arr.push_back(i);
if(n/i!=i) arr.push_back(n/i);
}
}
for(auto i:arr) {
for(auto j:arr) {
for(auto k:arr) {
if(i*j*k==n) {
cnt++;
}
}
}
}
cout<<cnt;
return 0;
}
总结:求约数的方法
for(ll i=1; i*i<=n; i++) {
if(n%i==0) {
arr.push_back(i);
if(n/i!=i) arr.push_back(n/i);
}
}
/*
如果i能整除n,说明i是n的因数,同时n/i的结果也是n的因数,
此时,如果n是4,当i是2的时候,不能同时添加i和n/i,故需要
判断if(n/i!=i),之后再push_back(n/i)
*/
2024/9/20:14.杨辉三角形 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+10;
ll a[N], b[N];
int main()
{
ll n;
cin>>n;
a[0]=b[0]=1;
if(n==1) {
cout<<1<<endl;
return 0;
}
for(ll i=3; i<=44723; i++) {
for(ll j=1; j<=i/2; j++) {
if(j==i/2 && i%2==1) b[j]=2*a[j-1];
else b[j]=a[j-1]+a[j];
a[j-1]=b[j-1];//更新滚动数组
if(b[j]==n) {
cout<<i*(i-1)/2+j+1;
return 0;
}
}
a[i/2]=b[i/2];
if(b[1]>n) {
cout<<n*(n+1)/2+2;
return 0;
}
}
cout<<n*(n-1)/2+2<<endl;
return 0;
}
2024/9/21:1.路径之谜 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=21;
int n;
int arr1[N], arr2[N];
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
int vis[N][N]={0};
int num[N][N];
vector<int> path;
void dfs(int x, int y) {
if(arr1[y]<0 || arr2[x]<0)
return;
if(x==n-1 && y==n-1) {
bool judge=1;
for(int i=0; i<n; i++) {
if(arr1[i]!=0 || arr2[i]!=0)
judge=0;
}
if(judge) {
for(int i=0; i<path.size(); i++) {
cout<<path[i]<<" ";
}
}
return;
}
for(int i=0; i<4; i++) {
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=0 && ty>=0 && tx<n && ty<n && vis[tx][ty]==0) {
vis[tx][ty]=1;
arr1[ty]--;
arr2[tx]--;
path.push_back(num[tx][ty]);
dfs(tx, ty);
vis[tx][ty]=0;
arr1[ty]++;
arr2[tx]++;
path.pop_back();
}
}
}
int main() {
cin>>n;
for(int i=0; i<n; i++) {
cin>>arr1[i];
}
for(int i=0; i<n; i++) {
cin>>arr2[i];
}
for(int i=0, temp=0; i<n; i++) {
for(int j=0; j<n; j++) {
num[i][j]=temp++;
}
}
vis[0][0]=1;
arr1[0]--;
arr2[0]--;
path.push_back(num[0][0]);
dfs(0, 0);
}
//0 1 5 4 8 12 13 14 10 6 7 11 15
需要注意箭靶上的数字对应的坐标轴的方向
2024/9/22:9.等差素数列 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool isPrime(int x) {
for(int i=2; i<x; i++) {
if(x%i==0) {
return false;
}
}
return true;
}
int main() {
int ans=1;
for(int i=2; i<10; i++) {
if(isPrime(i)) {
ans*=i;
}
}
cout<<ans;
return 0;
}
/*
等差素数列的公差等于所有小于等差素数列的长度的素数的乘积
*/
2024/9/23:18.修建公路1 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
#define ll long long
#define M 200100
//Kruskal
using namespace std;
int edge[M][3], fa[M], ans=0, cnt=0;
ll n, m, x, y, z;
void init() {
for(int i=0; i<M; i++) {
fa[i]=i;
}
}
int find_(int i) {
if(fa[i]==i) {
return i;
}
return fa[i]=find_(fa[i]);
}
bool isSameRoot(int x, int y) {
return find_(x)==find_(y);
}
bool union_(int x, int y) {
if(isSameRoot(x, y)) {
return false;
}
fa[find_(x)]=find_(y);
return true;
}
int cmp(const void* a, const void* b) {
int* x=(int* )a;
int* y=(int* )b;
return x[2]-y[2];
}
int main()
{
init();
cin>>n>>m;
for(int i=0; i<m; i++) {
cin>>x>>y>>z;
edge[i][0]=x;
edge[i][1]=y;
edge[i][2]=z;
}
qsort(edge, m, sizeof(int[3]), cmp);
for(int i=0; i<m; i++) {
if(union_(edge[i][0], edge[i][1])) {
cnt++;
ans+=edge[i][2];
}
}
cnt==n-1? cout<<ans: cout<<-1;
return 0;
}
过60%的案例,大数据案例错误,疑似算法优化不够
2024/9/24:4.蓝桥幼儿园 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
#define ll long long
#define N 1000005
using namespace std;
ll n, m;
ll fa[N], size[N], pre[N];
void init() {
for(int i=0; i<N; i++) {
fa[i]=i;
}
}
int find_(int i) {
if(fa[i]==i) {
return i;
}
return fa[i]=find_(fa[i]);
}
bool sameRoot(int x, int y) {
return find_(x)==find_(y);
}
void union_(int x, int y) {
if(!sameRoot(x, y)) {
fa[find_(x)]=find_(y);
}
}
int main() {
cin>>n>>m;
init();
while(m--) {
int op, x, y;
cin>>op>>x>>y;
if(op==1) {
union_(x, y);
}
else {
if(sameRoot(x, y)) {
cout<<"YES"<<endl;
}
else {
cout<<"NO"<<endl;
}
}
}
return 0;
}
2024/9/25:OpenJudge - 8462:大盗阿福
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX=3e5+10;
int arr[MAX], T, N, money[MAX];
int main() {
cin>>T;
while(T--) {
cin>>N;
for(int i=1; i<=N; i++) {
cin>>arr[i];
}
for(int i=1; i<=N; i++) {
if(i==1) {
money[1]=arr[1];
} else if(i==2) {
money[2]=max(arr[1], arr[2]);
} else {
money[i]=max(money[i-2]+arr[i], money[i-1]);
}
}
cout<<money[N]<<endl;
}
return 0;
}
/*
2
3
1 8 2
4
10 7 6 14
*/
2024/9/28:2.数字三角形 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
using namespace std;
const int MAX=1e2+10;
int arr[MAX][MAX], dp[MAX][MAX];
int N, sum=-100;
int main() {
cin>>N;
for(int i=0; i<N; i++) {
for(int j=0; j<=i; j++) {
cin>>arr[i][j];
}
}
dp[0][0]=arr[0][0];
for(int i=1; i<N; i++) {
dp[i][0]=dp[i-1][0]+arr[i][0];
dp[i][i]=dp[i-1][i-1]+arr[i][i];
}
for(int i=1; i<N; i++) {
for(int j=1; j<i; j++) {
dp[i][j]=max(dp[i-1][j], dp[i-1][j-1])+arr[i][j];
if(sum<dp[i][j])
sum=dp[i][j];
}
}
cout<<sum;
return 0;
}
2024/9/27:1.数字三角形 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll MAX=1e2+10;
int arr[MAX][MAX], dp[MAX][MAX];
int N;
int main() {
cin>>N;
for(int i=1; i<=N; i++) {
for(int j=1; j<=i; j++) {
cin>>arr[i][j];
}
}
for(int i=1; i<=N; i++) {
for(int j=1; j<=N; j++) {
if(i==1 && j==1)
dp[i][i]=arr[i][i];
dp[i][j]=max(dp[i-1][j], dp[i-1][j-1])+arr[i][j];
}
}
//判断左右走的距离不超过1???
if(N%2==0) {
cout<<max(dp[N][N/2], dp[N][N/2+1]);
} else {
cout<<dp[N][(N+1)/2];
}
return 0;
}
2024/9/28:4.跳跃 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX=1e2+10;
int n, m;
int maze[MAX][MAX], arr[MAX][MAX];
int dx[]={0, 0, 0, 1, 1, 1, 2, 2, 3};//方向数组
int dy[]={1, 2, 3, 0, 1, 2, 0, 1, 0};
int sum=-100;//寻找到最大的情况保存在sum中
void dfs(int x, int y, int w) {//dfs,参数w是目前位置的最大和
if(x==n-1 && y==m-1) {
if(w>sum) {
sum=w;
} else {
return ;
}
}
for(int i=0; i<9; i++) {
int tx=x+dx[i];
int ty=y+dy[i];
if(tx<n && ty<m) {
dfs(tx, ty, w+maze[tx][ty]);//加上下一步走的位置的数值
}
}
return ;
}
int main()
{
cin>>n>>m;
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
cin>>maze[i][j];
}
}
dfs(0, 0, 0);
cout<<sum+maze[0][0];//计算上起点的值
return 0;
}
/*
3 5
-4 -5 -10 -3 1
7 5 -9 3 -10
10 -2 6 -10 -4
*/
2024/9/29:9.卡片 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll MAX=1e7+10;
ll k=0, n;
int dp[MAX];
int main()
{
cin>>n;
for(int i=1; i; i++) {
if(i==1) {
dp[i]=i;
}
dp[i]=dp[i-1]+i;//状态转移方程
if(dp[i]>=n) {
cout<<i;
break;
}
}
return 0;
}
2024/9/30:1.小明的背包1 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
#define MAX 1001
using namespace std;
int N, V, w[MAX], v[MAX], dp[MAX+1][MAX+1]= {0};
int main() {
cin>>N>>V;
for(int i=1; i<=N; i++) {
cin>>v[i]>>w[i];
}
for(int i=1; i<=N; i++) {
for(int j=1; j<=V; j++) {
if(j<v[i]) {
dp[i][j]=dp[i-1][j];
} else {
dp[i][j]=max(dp[i-1][j], dp[i-1][j-v[i]]+w[i]);
}
}
}
cout<<dp[N][V];
return 0;
}
2024/10/1:2.小明的背包2 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
using namespace std;
const int MAX=1e3+10;
int N, V, w[MAX], v[MAX], dp[MAX];
int main() {
cin>>N>>V;
for(int i=1; i<=N; i++) {
cin>>w[i]>>v[i];
}
for(int i=1; i<=N; i++) {//依赖正上方一格和左侧的状态
for(int j=w[i]; j<=V; j++) {
dp[j]=max(dp[j], dp[j-w[i]]+v[i]);
}
}
cout<<dp[V];
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int MAX=1e3+10;
int N, V, dp[MAX][MAX], w[MAX], v[MAX];
int main() {
cin>>N>>V;
for(int i=1; i<=N; i++) {
cin>>w[i]>>v[i];
}
for(int i=1; i<=N; i++) {
for(int j=0; j<=V; j++) {
dp[i][j]=dp[i-1][j];
if(w[i]<=j) {
dp[i][j]=max(dp[i][j], dp[i][j-w[i]]+v[i]);
}
}
}
cout<<dp[N][V];
return 0;
}
2024/10/2:3.小明的背包
#include <bits/stdc++.h>
using namespace std;
const int MAX=1e3+10;
int dp[MAX][MAX], N, V, w, v;
int main() {
cin>>N>>V;
for(int i=1; i<=N; i++) {
for(int j=0; j<=V; j++) {
dp[i][j]=dp[i-1][j];
}
int s; cin>>s;
while(s--) {
cin>>w>>v;
for(int j=w; j<=V; j++) {
dp[i][j]=max(dp[i][j], dp[i-1][j-w]+v);
}
}
}
cout<<dp[N][V];
return 0;
}

被折叠的 条评论
为什么被折叠?



