T0
没有打什么题,只能放一张经典老图垫着。
T1
在一个L*W的矩形中,我们将四周的小正方形涂成红色,将其余的小正方形涂成棕色。
现在已知红色正方形的个数以及棕色正方形的个数,求原矩形的大小。
画一个图,模拟一下,当然可以直接使用△=b^2-4ac,但是我担心会有精度上的误差,因此采用枚举。
#include
using namespace std;
int R, B;
int main() {
scanf("%d%d", &R, &B);
// 2(x+y)-4=R
// x+y=(R+4)/2
// (x-2)(y-2)=B
for (int x = 1; x < (R + 4) / 2; x++) {
int y = (R + 4) / 2 - x;
if ((x - 2) * (y - 2) == B) {
printf("%d %d\n", y, x);
return 0;
}
}
return 0;
}
T2
幼儿园里共有n位小朋友,这天乐乐买了若干糖果希望均分给大家.
可没想到大家一哄而上,有的拿的多,有的拿的少…
乐乐很生气,他要选出k位小朋友,批评他们,并重新分配他们手里的糖果.
重新分配的意思是,没收这人手里的所有糖果,按需要分配给全部的人.
当然某人的糖果再还给他也是可以的.
乐乐希望你能给出一个方案,使得尽量小.因为他不想批评太多人.
毫无疑问,只要求完平均数后大于平均数的均需要重新分配。
#include
using namespace std;
const int N = 2e5 + 5;
int n, a[N], sum = 0, res;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
sum += a[i];
}
if (sum % n) {
puts("-1");
return 0;
}
sum /= n;
for (int i = 1; i sum)
res++;
}
printf("%d", res);
return 0;
}
T3
WW认为O和X是最优美的两个字母,由O、X组成的串是优美的串。在这些优美的串中,如果任意只包含X的子串,长度不超过maxX,任意只包含O的子串,长度不超过maxO,且整个串最多有CountO个O,CountX个X。那么这个就是超级优美无敌串。
现在WW想知道的最长的优美无敌串有多长,希望你告诉他。
分类讨论。
#include
using namespace std;
int cnto, cntx, maxo, maxx, res;
vector O, X;
int main() {
scanf("%d%d%d%d", &cnto, &cntx, &maxo, &maxx);
printf("%d\n", min(cnto, (cntx + 1) * maxo) + min(cntx, (cnto + 1) * maxx));
return 0;
}
T4
有一条大河。在河的两岸,从上到下有M+1个村庄,编号为0到M,相邻两个村庄的距离为1.
Mirko住在0号村,他今天要去M号村。同时他要载一些客人,送他们到目的地。他的船容量无限。
举个例子,A要从2号村到8号村,B要从6号村到4号村。Mirko从0出发,在2号村接上A,再到6号村接上B,再去4号村放下B,再去8号村,放下A。在继续前去M村。
现在需要制定一个路线,满足所有的人,并最终去M村。同时总行程最小。
正方向的不用考虑,仅需考虑反方向,对所有反方向的作区间合并,随后统计答案。
#include
using namespace std;
const int N = 300005;
typedef long long LL;
int n, m;
LL res;
vector<pair > P;
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i y)
P.push_back({ y, x });
}
sort(P.begin(), P.end());
int st = -2e9, ed = -2e9;
for (int i = 0; i < P.size(); i++) {
if (ed < P[i].first) {
res += 2LL * (ed - st);
st = P[i].first;
ed = P[i].second;
} else
ed = max(ed, P[i].second);
}
res += 2LL * (ed - st);
printf("%lld", res + (LL)m);
return 0;
}