每日一练:

目录

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)

2024/10/2:3.小明的背包

2024/10/3:


代码模板
#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;
}
2024/10/3:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值