2024.5.25期末测试总结

成绩:

配置:

可能与实际有些出入

题目:

第一题:

代码思路:

一道模拟题,按照公式计算出sum+=pow(2,i),判断sum>H,输出

代码:

#include<bits/stdc++.h>
using namespace std;

int main(){
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	long long h,ans = 1; cin >> h;
	for(int i = 1; i <= (h+100); i++){
		ans += pow(2,i);
		if(ans > h){
			cout << (i+1) << endl;
			break;
		}
	}
	return 0;
} 

第二题:

代码思路:

        前缀和的经典题目。

        输入,求前缀和,枚举K(正方形边长)从1-max(m,n),从开始枚举正方形左上端点如果等于k*K说明其完全由1的数字组成,最后输出最大的K。

代码:

#include<bits/stdc++.h>
using namespace std;

const int N  = 250;
int a[N][N],s[N][N];

int main(){
	freopen("b.in","r",stdin);
	freopen("b.out","w",stdout);
	int n,m; cin >> n >> m;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cin >> a[i][j];
			s[i][j] = s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
		}
	}
	int maxn = 0;
	for(int k = 1; k <= min(n,m); k++){
		bool flag2 = 1;
		for(int i = 1; i <= n-k+1; i++){
			bool flag = 0;
			for(int j = 1; j <= m-k+1; j++){
				if((s[i+k-1][j+k-1]-s[i+k-1][j-1]-s[i-1][j+k-1]+s[i-1][j-1]) == k*k){
					 maxn = max(maxn,k);
					 flag = 1;
					 break;
				}
			}
			if(flag) break; 
		}
	}
	cout << maxn << endl;
	return 0;
} 

第三题:

代码思路:

        差分题目。数据范围较大如果暴力会超时,所以考虑差分。

        创建差分数组a储存数字,如果在l-r区间内+1,则a[l]+=1,a[r+1]-=1,最后进行前缀和操作,排序,输出中位数。

代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 1000010;
long long a[N];
int main(){
	freopen("c.in","r",stdin);
	freopen("c.out","w",stdout);
	int n,k; cin >> n >> k;
	for(int i = 1; i <= k; i++){
		int l,r; cin >> l >> r;
		a[l] += 1; a[r+1] -= 1;
	}
	for(int i = 1; i <= n; i++){
		a[i] = a[i-1]+a[i];
	}
	sort(a+1,a+n+1);
	cout << a[n/2+1] << endl;
	return 0;
} 

第四题:

代码思路:

        二分答案经典习题。错误原因:check函数没有写对。

        二分选择间隔距离,如果按照此间隔不可以放完所有牛,在l-mid-1区间里继续二分。

否则,在mid-r的区间里二分。

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int a[N], n, c;

bool check(int mid) {
    int res = 1, prev = a[1];
    for (int i = 2; i <= n; i++) {
        if (a[i] - prev >= mid) {
            res++;
            prev = a[i];
        }
    }
    return res >= c;
}

int main() {
    freopen("d.in", "r", stdin);
    freopen("d.out", "w", stdout);

    cin >> n >> c;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    sort(a + 1, a + n + 1);

    int l = 0, r = a[n] - a[1];
    while (l < r) {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }

    cout << l << endl;

    return 0;
}

第五题:

代码思路:

        错误思路:排序+暴力.优化(遇到a[j]的数不合法就结束)。(70-80分)

        正确思路,二分查找右端点,r-l之间就是a[i]位上的搭配。

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 50010;
int n, s;
int a[N];

int main() {
    freopen("e.in", "r", stdin);
    freopen("e.out", "w", stdout);

    cin >> n >> s;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    sort(a + 1, a + n + 1);

    int ans = 0;
    for (int i = 1; i + 1 <= n && a[i] < s; i++) {
        int l = i + 1, r = n;
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (a[mid] <= s - a[i]) l = mid;
            else r = mid - 1;
        }
        if (a[l] <= s - a[i]) ans += l - i;
    }

    cout << ans << endl;

    return 0;
}

总结:

此次题目并不算难但是成绩却不是理想,所以要继续努力,计划每周做一套csp-j/s的初赛题

,和3道附加题。

加油!!!!路虽远行则将至,事虽难做则必成,励志前行,未来可期。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值