我打教育场就没上过分,一直被教育。。。
当晚的环境也不是很好,舍友在开黑打王者,mmp
数学专场------
A
显然,高度增加的要平均
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n, k;
cin >> n >> k;
if(k % n == 0)
cout << k / n << endl;
else
cout << k / n + 1 << endl;
return 0;
}
B
几乎推了2h,越推越懵逼,现在反思一下,我当时把横向和纵向两个过程看得太过于独立了,人为的分了先后,并且一直以对角线上的运动为切入点,即认为所以点都可以看做是从对角线移动过去的。总之死的很惨啦
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n, m, k;
ll q, ans;
cin >> q;
while(q --){
cin >> n >> m >> k;
ans = k;
if(max(n, m) > k){
cout << -1 << endl;
continue ;
}
else{
if(k % 2 != n % 2)
ans --;
if(k % 2 != m % 2)
ans --;
cout << ans << endl;
}
}
return 0;
}
D
比赛结束5min时发现这是道大水题,于是噼里啪啦一顿乱敲,压线没编译交了发,wa1.。。。。
这题就是维护两个位置不断相加的过程
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 300300;
int n, m;
int a[N], b[N];
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i ++)
scanf("%d", &a[i]);
scanf("%d", &m);
for(int i = 0; i < m; i ++)
scanf("%d", &b[i]);
ll sum1 = 0, sum2 = 0;
for(int i = 0; i < n; i ++)
sum1 += a[i];
for(int i = 0; i < m; i ++)
sum2 += b[i];
if(sum1 != sum2){
cout << -1 << endl;
return 0;
}
int posa = 0, posb = 0;
int res = 0;
while(posa < n){
res ++;
ll suma = a[posa ++], sumb = b[posb ++];
while(suma != sumb){
if(suma < sumb) suma += a[posa ++];
else sumb += b[posb ++];
}
}
cout << res << endl;
return 0;
}