A. Sequence with Digits
【模拟】纸老虎...按照规则模拟,当(minDigit(a_i)=0)时退出模拟。
B. Young Explorers
【贪心】(e_i)的意思是若该队员想要组队,队内至少有(e_i)名成员(包括他自己)才能出发。一些人也可以不组队。
按照(e_i)小到大组队。当前最大(e_i)值都满足了之后,就可以组成一支新队。
有桶排的味道,但这里桶排被TLE了(亲测quq)
D. Game With Array
【构造】Petya有一个数组有(N)个数字,它们的和为(S)。Vasya要从这个数组里取一些数并对其求和,Vasya的总和等于(K)或者(S-K),则是Vasya获胜。((K)为Petya给定的一个不大于(K)的数)现在如何构造这个(N)个数的数组以及(K),才能让Vasya不能获胜。
仔细想想可以发现,Petya的获胜的条件就是,数组里的数不能完全组合成[1,S]。而构造这种,一般从1开始找就很舒服了。
当(N > S / 2)时,Vasya必胜;
当(S)为偶数时,前(N-1)个数为1,第(N)个数为(S-(N-1))。这样,原数组的数不能组合成(S/2);
当(S)为奇数时,前(N-1)个数为1,第(N)个数为(S-(N-1))。这样,原数组的数不能组合成(S/2)与(S/2 + 1)。
AC代码
A
//
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
int T;
LL a, k;
int main()
{
scanf("%d", &T);
while(T--){
scanf("%I64d %I64d", &a, &k);
for(LL i = 1; i < k; i++){
LL tmp = a;
LL x = 20, d = -1;
while(tmp){
if(tmp % 10 < x) x = tmp % 10;
if(tmp % 10 > d) d = tmp % 10;
tmp /= 10;
}
if(x == 0 || d == 0)
break;
// printf("a:%I64d x:%I64d d:%I64d
", a, x, d);
a += x * d;
}
printf("%I64d
", a);
}
return 0;
}
B
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T, n;
int num[200005];
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &num[i]);
}
sort(num, num + n);
int cnt = 0, big = 0, ans = 0;
for(int i = 0; i < n; i++){
if(big < num[i]) big = num[i];
cnt++;
if(cnt / big > 0) {
ans += cnt / big;
cnt %= big;
}
}
printf("%d
", ans);
}
return 0;
}
D
//
#include<iostream>
#include<cstdio>
using namespace std;
int n, s;
int num[1000006];
int main()
{
scanf("%d %d", &n, &s);
if(n > s / 2) printf("NO
");
else {
printf("YES
");
for(int i = 0; i < n - 1; i++){
printf("1 ");
}
printf("%d
", s - (n - 1));
printf("%d
", s / 2);
}
return 0;
}