「EZEC」 Round2 六六欢乐赛(赛时)

神奇的比赛,虽说老师让我们不要在意成绩,但一次比赛多少有点紧张(或是说激动?),然后上来看完第一题就懵逼了----第一题都不会做????
于是自信心受到打击,前一个小时都在乱水,啥也没弄出来。

  1. 「EZEC-2」异或

后来回过头看了看一题,想了想数据,决定碰一碰运气----默认最大输出时a中只有异或最大的两个数(因为样例是满足的)。
然后就开始枚举范围内所有的异或值,最后找到最大的,因为同数异或为0,所以只要让a中两个数(之前枚举出来异或最大的两个数)相互异或的次数尽可能多,所以毫无疑问要尽可能平均的放置两个数啦。
然后找了找规律,把情况打出来了:

if (l == 2) {
			ans += zd;
		} else if (l == 3) {
			ans += zd;
			ans += zd;
		} else if (l == 4) {
			ans += zd;
			ans *= 4;
		} else {
			ans += zd;
			ans *= 6;
		}

暴力当然不是正解,但是看到50分时我就惊呆了(数据好水
代码如下:

#include <bits/stdc++.h>
using namespace std;
int main() {
	int T , n , l , zd , az;
	int mg , ans;
	cin >> T;
	for (register int sb = 1;sb <= T;sb++) {
		cin >> n >> l;
		zd = 0;
		az = 0;
		for (register int i = 1;i <= n;i++) {
			for (register int j = 1;j <= n;j++) {
				az = i;
				az ^= j;
				if (az > zd) {
					zd = az;
				}
			}
		}
		ans = 0;
		if (l == 2) {
			ans += zd;
		} else if (l == 3) {
			ans += zd;
			ans += zd;
		} else if (l == 4) {
			ans += zd;
			ans *= 4;
		} else {
			ans += zd;
			ans *= 6;
		}
		cout << ans % 1000000007 << endl;
	}
	return 0;
}

很短的代码,只打了一小会,register是后来加上的,还试了试吸氧,不过50分就没得变了,后面的数据还是很严的。

  1. 「EZEC-2」字母
    T1拿了50分后士气大振,于是开始看T2(之前直接跳过了 ),看看能不能像T1一样拿点部分分。
    事实证明是可以的,直接爆搜枚举字母“T”的一横的左右端点,然后再找到中点向下枚举,累加满足条件的“T”的个数最后输出。
    交上去一看,咦?30分?
    O2开上,register加上,35分。
    该放弃了吧,但是错了第一点啊?这个肯定不是数据大的原因了,那一定是有什么毒瘤数据吧。想了想,题目好像没有说矩阵的边长必须大于1?但是大于一就是没有啊,看看自己的程序,似乎并不是这样…
    于是就果断加上了特判啦~
if (n == 1 || m == 1) {
		cout << 0;
	} else {
		cout << ans;
	}

40分妥妥的到手了!

#include <bits/stdc++.h>
using namespace std;
char sz[3001][3001];
int n , m;
int a , b , s , x , k;
int main() {
	int ans = 0;
	cin >> n >> m;
	cin >> a >> b >> s >> x;
	for (register int i = 1;i <= n;i++) {
		for(register int j = 1;j <= m;j++) {
			cin >> sz[i][j];
		}
	}
	for (register int i = 1;i <= n;i++) {
		for (register int j1 = 1;j1 <= m;j1++) {
			if (sz[i][j1] == '1') {
				for (register int j2 = j1 + 1;j2 <= m;j2++) {
					if (sz[i][j2] == '0') {
						break;
					} else {
						if (j2 % 2 - j1 % 2 == 0 && j1 != j2) {
							if (j2 - j1 + 1 >= a) {
								for (register int h = i;h <= n;h++) {
									if (sz[h][(j2 + j1) / 2] == '0') {
										break;
									} else {
										if (h - i + 1 >= b && (h - i + 1) * (j2 - j1 + 1) >= s && h - i + 2 + j2 - j1 >= x && h - i + 1 > 1) {
											ans++;
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	if (n == 1 || m == 1) {
		cout << 0;
	} else {
		cout << ans;
	}
	return 0;
}
  1. 「EZEC-2」机器

这厮是真的不会,根本就不懂分数取模啊!题面下的提示点进去居然是另外一道题,比赛时谁有心思去看那些啊?于是连前几个点也拿不到分…
悲痛!

  1. 「EZEC-2」数轴

若找不到符合条件的二元组 (l,r)(l,r),输出 -1。

本来想这样骗一点分来着,但是输出-1就是满江红。
似乎有一些二分的思路,但是不知道对不对而且时间不够所以就放弃
于是开始正经一点的思考题目,自然还是暴力,毕竟不会正解…
又自然而然的想到了枚举…左端点右端点挨着枚举,一直枚举到大于K后记录长度,max比较,输出。
16分…有点少啊,看了看标签

O2优化

有趣…吸一口氧气,分翻了整整一倍!!!!!
想了想,又加上了register。
噫!好!我中了! 又多了8分,到达极限----40分

#include <bits/stdc++.h>
using namespace std;
int main() {
	int az[100001];
	int z , y;
	int n , m , k , x , a , zs , zd;
	cin >> n >> m >> k;
	for (register int i = 0;i <= m;i++) {
		az[i] = 0;
	}
	for (register int hh = 1;hh <= n;hh++) {
		cin >> x >> a;
		az[x] += a;
		zd = -1;
		for (register int i = 0;i <= m;i++) {
			zs = 0;
			for (register int j = i;j <= m;j++) {
				zs += az[j];
				if (zs > k) {
					zd = max(zd , j - 1 - i);
					break;
				} else if (j == m) {
					zd = max(zd , j - i);
					break;
				}
			}
		}
		cout << zd << endl;
	}
	return 0;
}

暴力的代码不可能难的嘛,所以还是简单的短代码…

  1. 「EZEC-2」甜梦
    考的似乎的DP啊,可是DP没学好也不会做,而且唯一可以骗到的5分也没弄到手…难
    真就越考越难。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值