2023/6/9---个人总结

文章包含了几道编程题目,主要涉及线段的处理,如检查是否能构成矩形,以及使用二分查找和素数计算的算法。第一题检查给定线段能否组成矩形,第二题通过排序和分块策略解决数组问题,第三题关注产品质量的排序,最后一题则涉及到素数表的生成和使用。
摘要由CSDN通过智能技术生成

G - Four Segments

这题没什么难度,但是好狗,我踩了很多坑

typedef struct {
	int x, y;
}zb;
zb bb[15];
bool cmp(zb a, zb b) {
	if (a.x == b.x) {
		return a.y < b.y;
	}
	else return a.x < b.x;
}
bool ck(zb a, zb b) {
	return a.x == b.x && a.y == b.y;
}
void solve() {
	int x1, y1, x2, y2;
	int l = 0;    
	int f = 0; 
	int x = 0, y = 0;    //平行x轴和平行y轴的线段数量
	for (int i = 0; i < 4; i++) {
		cin >> x1 >> y1 >> x2 >> y2;
		bb[l].x = x1;
		bb[l++].y = y1;
		bb[l].x = x2;
		bb[l++].y = y2;
		if (x1 == x2)y++;
		if (y1 == y2)x++;
		//判断是否有重点,有线段不平行于任何一轴,平行x轴和平行y轴的线段数量大于2
		if (x1 == x2 && y1 == y2 || x1 != x2 && y1 != y2 || x > 2 || y > 2) {
			f = 1;
		}
	}
	if (f) {
		cout << "NO\n";
		return;
	}
	f = 0;
	sort(bb, bb + l, cmp);
	for (int i = 0; i < l - 1; i++) {  //判断是否符合矩形条件(有4对相等的端点,但相同的端点个数不能超过两个)
		if (!ck(bb[i], bb[i + 1]) && f == 0 || ck(bb[i], bb[i + 1]) && f == 1) {
			cout << "NO\n";
			return;
		}
		else if (!ck(bb[i], bb[i + 1]) && f == 1)f = 0;
		else f = 1;
	}
	cout << "YES\n";
}

Problem - D - Codeforces (Unofficial mirror by Menci)

将是数字排序后分为3块,分别由3个人负责,通过二分,先找左边符合条件的最大区间,再找右边的最大区间,剩下的中间再判断是否满足条件。

const int N = 2e5 + 5;
int a[N];
void solve() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) cin >> a[i];
	sort(a, a + n);
	//将是数字排序后分为3块,分别由3个人负责,通过二分,先找左边符合条件的最大区间
	//再找右边的最大区间,剩下的中间再判断是否满足条件
	long long l = -1, r = 1e9; 
	while (r - l > 1) {
		long long mid = (r + l) >> 1;
		int i = 0, j = n - 1;
		while (i + 1 < n && a[i + 1] - a[0] <= 2 * mid)i++;   //左
		while (j - 1 >= 0 && a[n - 1] - a[j - 1] <= 2 * mid)j--;  //右
		i++, j--;
		if (i > j || a[j] - a[i] <= 2 * mid) {  //中间
			r = mid;
		}
		else l = mid;
	}
	cout << r << '\n';
}

I - Laptops

将原数组按照价格排序之后,遍历比较质量低下即可。

void solve() {
	int n;
	cin >> n;
	int maxn = 0; int mb = 0;
	int minn = 99999; int ib = 0;
	for (int i = 0; i < n; i++) {
		cin >> aa[i].a >> aa[i].b;
	}
	sort(aa, aa + n, cmp);
	for (int i = 1; i < n; i++) {
		if (aa[i - 1].b > aa[i].b) {
			cout << "Happy Alex\n";
			return;
		}
	}
	cout << "Poor Alex\n";
}

https://vjudge.net/problem/AtCoder-abc300_d/origin

先求出数据范围内的所有素数,如何从小到大遍历。

typedef long long ll;
const int MAXN = 316228;  //(sqrt(10^12))
vector<int> primes;    //素数表
bool isPrime[MAXN+1];
void getprimes() {    //获取素数表
    fill(isPrime, isPrime + MAXN + 1, true);
    isPrime[0] = isPrime[1] = false;
    for (int i = 2; i <= MAXN; i++) {
        if (isPrime[i]) {
            primes.push_back(i);
            for (ll j = (ll) i * i; j <= MAXN; j += i) {
                isPrime[j] = false;
            }
        }
    }
}
void solve() {
    getprimes();
    ll n;
    cin >> n;
    ll ans = 0;
    for (int i = 0; i < primes.size(); i++) {
        ll a = primes[i];
        if (a * a * a * a * a >= n)break;
        for (int j = i + 1; j < primes.size(); j++) {
            ll b = primes[j];
            if (a * a * b * b * b >= n)break;
            for (int k = j + 1; k < primes.size(); k++) {
                ll c = primes[k];
                if (a * a * b * c * c > n)break;
                ans++;
            }
        }
    }
    cout << ans << '\n';
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

akb000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值