神奇的比赛,虽说老师让我们不要在意成绩,但一次比赛多少有点紧张(或是说激动?),然后上来看完第一题就懵逼了----第一题都不会做????
于是自信心受到打击,前一个小时都在乱水,啥也没弄出来。
- 「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分就没得变了,后面的数据还是很严的。
- 「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;
}
- 「EZEC-2」机器
这厮是真的不会,根本就不懂分数取模啊!题面下的提示点进去居然是另外一道题,比赛时谁有心思去看那些啊?于是连前几个点也拿不到分…
悲痛!
- 「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;
}
暴力的代码不可能难的嘛,所以还是简单的短代码…
- 「EZEC-2」甜梦
考的似乎的DP啊,可是DP没学好也不会做,而且唯一可以骗到的5分也没弄到手…难
真就越考越难。