最近打的两道有趣的题(HDU1496与cf-950)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Cymbals/article/details/83087155

两题虽然有趣,但是都不难,放在一起开篇博客记录一下。

HDU1496

a x 1 2 + b x 2 2 + c x 3 2 + d x 4 2 = 0 a*x1^2+b*x2^2+c*x3^2+d*x4^2=0
给一个式子,给出a,b,c,d.求有多少解, abcd范围 [-50,50] ,x1 - x4 [-100,100]。

很有意思,可以用hash优化求解。首先观察这个式子,肯定是分成两半,这两半绝对值相等,但是一正一负时有解,因为其数据范围小,可以直接分两半枚举求解。

然后又有一个小优化,虽然数据范围横跨正负,但是却刚好是对称的,所以可以只枚举整数部分,然后对正数部分答案乘2乘2乘2再乘2(4个变量)直接求解。

还有就是hash数组开的大,每次都memset的复杂度已经大于再执行一遍枚举过程,可以再次枚举来初始化优化掉这部分复杂度。

然而并没有这么做也还是水过去了。

ac代码:

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

const int maxn = 1e6 + 5;
int vis[maxn << 1];

int main() {
	int a, b, c, d;
	while(scanf("%d%d%d%d", &a, &b, &c, &d) != EOF) {
		bool noSolution = (a > 0 && b > 0 && c > 0 && d > 0)
		                  || (a < 0 && b < 0 && c < 0 && d < 0);
		if(noSolution) {
			printf("0\n");
			continue;
		}
		memset(vis, 0, sizeof(vis));
		for(int i = 1; i <= 100; i++) {
			for(int j = 1; j <= 100; j++) {
				++vis[(a * i * i) + (b * j * j) + maxn];
			}
		}

		int ans = 0;
		for(int i = 1; i <= 100; i++) {
			for(int j = 1; j <= 100; j++) {
				ans += vis[-1 * ((c * i * i) + (d * j * j)) + maxn];
			}
		}

		printf("%d\n", ans * 16);
	}
	return 0;
}

cf-950b:
给两个数列,让你可以顺序任意次数合并其中的数,但是要保证最终两个数列完全一致,问最终生成数列最长能有多长。

这题,我读完题之后还没来得及思考,不知道怎么脑海里就一直跳出“前缀和,前缀和”,于是遵从直觉,打前缀和,打完了之后才反应过来,前缀和就是一个自动顺序合并的过程,只要统计这两个数列的前缀和有多少个相同,就是最终答案了。

交上去就a了,这还是第一次思考都没有就直觉ac了,记录一下。

ac代码:

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

const int maxn = 1e5 + 5;
map<int, int> mp;


int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	int a[maxn], b[maxn];
	for(int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	for(int i = 0; i < m; i++) {
		scanf("%d", &b[i]);
	}
	for(int i = 0; i < n - 1; i++) {
		a[i + 1] += a[i];
		mp[a[i]]++;
	}
	mp[a[n - 1]]++;

	ll ans = 0;
	for(int i = 0; i < m - 1; i++) {
		b[i + 1] += b[i];
		if(mp.count(b[i])) {
			ans += mp[b[i]];
		}
	}

	if(mp.count(b[m - 1])) {
		ans += mp[b[m - 1]];
	}

	printf("%lld\n", ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Cymbals/article/details/83087155
今日推荐