A. FashionabLee
两边同时平行,是 4 4 4 的倍数即可。
AC代码:
int n, k, m;
int main()
{
int t;
sd(t);
while (t--)
{
sd(n);
if (n % 4 == 0)
puts("YES");
else
puts("NO");
}
return 0;
}
B. AccurateLee
对于每个 0 0 0 先存起来,对于每个 1 1 1 如果后面有 0 0 0 就可以找到最远的那个 0 0 0 然后把中间的都消去。
AC代码:
const int N = 5e5 + 50;
int n, k, m;
char s[N];
vector<int> ans;
int sum[N];
int main()
{
int t;
sd(t);
while (t--)
{
sd(n);
ss(s + 1);
ans.clear();
rep(i, 1, n + 1)
sum[i] = 0;
per(i, n, 1)
sum[i] = sum[i + 1] + (s[i] == '0');
rep(i, 1, n)
{
if (s[i] == '0')
ans.pb(0);
else
{
int j = i;
while (j + 1 <= n && sum[j + 1] > 0)
j++;
if (j > i)
ans.pb(0);
else
ans.pb(1);
i = j;
}
}
for (auto i : ans)
cout << i;
puts("");
}
return 0;
}
C. RationalLee
对于每个朋友,先从需要小的给他礼物,把需要礼物数是 1 1 1 的都分完,先分大的,这样可以保证满意度最大,然后再从需要礼物多的开始往小的分,从剩下的礼物里取,每次都是取一个最大的,然后剩下的取小的。
AC代码:
const int N = 5e5 + 50;
int n, k, m;
int a[N], b[N];
ll ans, res, cnt, tmp, pos;
int l, r;
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
int t;
sd(t);
while (t--)
{
sdd(n, k);
rep(i, 1, n)
sd(a[i]);
rep(i, 1, k)
sd(b[i]);
sort(b + 1, b + k + 1);
sort(a + 1, a + n + 1, cmp);
ans = 0;
pos = n + 1;
r = n, l = 0;
rep(i, 1, k)
{
if (b[i] == 1)
ans += 2 * a[i];
else
{
pos = i;
l = i;
break;
}
}
per(i, k, pos)
{
res = a[l] + a[r];
l++;
r -= b[i] - 1;
ans += res;
}
pld(ans);
}
return 0;
}
D. TediousLee
把 567 567 567 画出来应该就能看出来规律了, a i = a i − 1 + 2 ∗ a i − 2 a_i=a_{i-1}+2*a_{i-2} ai=ai−1+2∗ai−2,但是每多三层,中间的会多出了一组。
AC代码:
const int N = 5e6 + 50;
int n, m, k;
ll ans[N];
void init()
{
ans[1] = 0;
ans[2] = 0;
ans[3] = 4;
ans[4] = 4;
rep(i, 5, 2000000)
{
ans[i] = (ans[i - 1] + 2 * ans[i - 2]) % MOD;
if (i % 3 == 0)
ans[i] = (ans[i] + 4) % MOD;
}
}
int main()
{
init();
int t;
sd(t);
while (t--)
{
int n;
sd(n);
pld(ans[n]);
}
return 0;
}