A - Floor Number
输入房间号,问在第几层
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int main(void)
{
int t, n, x;
cin >> t;
while (t--) {
cin >> n >> x;
if (n <= 2) {
cout << 1 << endl;
} else {
int res = 1 + (n - 2) / x;
if ((n - 2) % x != 0)
res++;
cout << res << endl;
}
}
return 0;
}
B - Symmetric Matrix
左下角和右上角相等,并且m为偶数时满足条件
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int main(void)
{
int t, n, m;
int a, b, c, d;
cin >> t;
while (t--) {
cin >> n >> m;
bool f1, f2 = 0;
f1 = (m % 2 == 0 ? 1 : 0);
for (int i = 0; i < n; i++) {
cin >> a >> b >> c >> d;
if (b == c)
f2 = 1;
}
cout << ((f1 && f2) ? "YES" : "NO") << endl;
}
return 0;
}
C - Increase and Copy
先增加到一个界限 n \sqrt n n,然后再进行复制
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int main(void)
{
int t, n, now, res;
cin >> t;
while (t--) {
cin >> n;
now = 1; res = 0;
while (now <= (int)sqrt(n)) {
now++; res++;
}
//cout << now << endl;
now--; res--;
int num = (n - now) / now;
if ((n - now) % now != 0)
num++;
res += num;
cout << res << endl;
}
return 0;
}
D - Non-zero Segments
要在任意两个数之前添加任意大小的数字,使得子段和没有等于0的,求最少添加几次?
如果子段和等于0,说明前缀和 s u m [ r ] − s u m [ l − 1 ] = 0 sum[r] - sum[l - 1]=0 sum[r]−sum[l−1]=0,即 s u m [ l − 1 ] = s u m [ r ] sum[l-1]=sum[r] sum[l−1]=sum[r]
用一个map来进行记录,当前的前缀和出现的下标,如果之前出现过,并且是在上次添加元素之后,说明需要加一次数字
需要注意记录m[0]=1,因为 0 实际上是在下标 0 处出现的,懒得特判所以可以设置为 1
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
ll sum[N];
map<ll, ll> m;
int main(void)
{
ll n, t;
ll l = -1, res = 0;
cin >> n;
m[0] = 1;
for (int i = 1; i <= n; i++) {
scanf("%lld", &t);
sum[i] = sum[i - 1] + t;
if (m[sum[i]] && m[sum[i]] >= l - 1) {
res++;
l = i;
}
m[sum[i]] = i;
}
cout << res << endl;
return 0;
}
F题的题解:
https://www.cnblogs.com/BOZHAO/p/13747452.html