A. Floor Number
题目大意:
公寓中,除了第一层有两间房,其他每层都有x间房,所有的房间都按号码编号,给出一个房间号问他在第几层。
思路:
先减去起初的两间再除以每一层的房间数即可。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main() {
int t;
cin >> t;
while (t--)
{
int n, x;
cin >> n >> x;
int ans = 1;
n -= 2;
if (n <= 0)cout << 1 << endl;
else {
ans += ceil((double)n / x);
cout << ans << endl;
}
}
}
B. Symmetric Matrix
题目大意:
给定n种2x2的瓷砖,瓷砖的左上右上左下右下都有一个数字,每种瓷砖的数量无限,且不能分割,问能否最后拼出一个mxm的主对角线对称矩阵。
思路:
首先m为奇数时肯定不成立,其次只要存在至少一个瓷砖主对角线对称即可。
#include<iostream>
using namespace std;
int main() {
int t;
cin >> t;
while (t--)
{
int n, m;
cin >> n >> m;
int a, b, c, d;
int flag = 0;
for (int i = 1; i <= n; i++) {
cin >> a >> b >> c >> d;
if (c==b)flag = 1;
}
if (m % 2 || !flag)puts("NO");
else puts("YES");
}
}
C Increase and Copy
题目大意:
一个数组初始时只有一个元素且为1,每次操作可以对任意一个数进行加一或者,复制某一个数并放在数组的最后,问最少几次操作后可以使得数组中所有元素之和为n。
思路:
我们发现,答案在√n处出现,且要进行√n - 1 + (n / √n)- 1次操作,若此时数组之和不为n则加一。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long long n;
int main() {
int t;
scanf("%d", &t);
while (t--)
{
scanf("%lld", &n);
long long s = sqrt(n);
long long ans = (s + (n / s) - 2);
if (n % s)ans++;
printf("%lld\n", ans);
}
}
D Non-zero Segments
题目大意:
给定一个序列,求最少插入多少数,才能使此序列任意子段和均不为 0 .
插入的数字可以是你能想到的所有整数,
思路:
一开始想用o(n^2)的思路,果然被卡了。。所以我们用一个前缀和数组进行预处理,如果我们又发现一个点使得sum[ i ] = sum [ j ],则说明在i-j区间内有子序列之和为0,我们就可以用一个map打上一个标记,记录上一个为0的位置,意味着在此之前我们插入了一个极大的数,但是后面的前缀和并不受影响。
#include<iostream>
#include<algorithm>
#include<cmath>
#include <map>
using namespace std;
const int N = 200010;
typedef long long ll;
ll a[N];
map<ll, bool>mp;
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
ll sum = 0, ans = 0; mp[0] = true;//首先要将0的位置标记
for (int i = 1; i <= n; i++) {
sum += a[i];
if (mp[sum]) {
ans++;
mp.clear();
sum = a[i];
mp[0] = true;
}
mp[sum] = true;
}
cout << ans<<endl;
}
E Rock, Paper, Scissors
题目:
石头剪刀布,输出Alice能赢的最少次数和最多次数。
思路:
最多就直接判断即可,最少时先判断平局,再判断输局。
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 4;
ll a[N], b[N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= 3; i++)cin >> a[i];
for (int i = 1; i <= 3; i++)cin >> b[i];
ll mians = 0, maans = 0;
ll c = 0, d = 0, e = 0;
if (a[1] - b[1] - b[3] > 0) c = a[1] - b[1] - b[3];
if (a[2] - b[2] - b[1] > 0) d = a[2] - b[2] - b[1];
if (a[3] - b[3] - b[2] > 0) e = a[3] - b[3] - b[2];
mians = c + d + e;
maans = min(a[1], b[2]) + min(a[2], b[3]) + min(a[3], b[1]);
cout << mians << ' ' << maans;
}