A.
题意:给出一个数n 把n拆成若干个除首位以外都是0的和
思路:%一下 /一下就行
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define mes(x,a) memset(x,a,sizeof(x));
#define sca(a) scanf("%d",&a)
#define lowbit(x) x & (-x)
#define mk make_pair
#define pb(x) push_back(x)
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define lson v << 1
#define rson v << 1 | 1
#define pii pair<int, int>
inline int read()
{
int x=0,flag_read=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
flag_read=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*flag_read;
}
int main()
{
int t;
cin >> t;
while(t --){
vector <int> v;
int n;
cin >> n ;
int k = 1;
while(n){
if(n % 10 == 0){
k *= 10;
n /= 10;
continue;
}
v.pb((n % 10) * k);
n /= 10;
k *= 10;
}
cout << v.size() << '\n';
for(int i = 0;i < v.size();i ++){
cout << v[i] << ' ';
}
cout << '\n';
}
return 0;
}
B.
题意:将n拆成k个数之和 要求k个数均为偶数 或者 均为 奇数
思路:n < k 是肯定不行的 分别用 k - 1 个 1 或 2 去构造 最后一个数由n减去之前的值 判断奇偶性即可
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define mes(x,a) memset(x,a,sizeof(x));
#define sca(a) scanf("%d",&a)
#define lowbit(x) x & (-x)
#define mk make_pair
#define pb(x) push_back(x)
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define lson v << 1
#define rson v << 1 | 1
#define pii pair<int, int>
inline int read()
{
int x=0,flag_read=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
flag_read=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*flag_read;
}
int main()
{
int t;
cin >> t;
while(t--){
int n , k;
cin >> n >> k ;
if(k > n){
cout << "NO" <<'\n';
continue;
}
int x = 2 * (k - 1);
int y = n - x;
int a = k - 1;
int b = n - a;
if(y > 0 && y%2 == 0){
cout << "YES" << '\n';
for(int i = 0;i < k - 1;i ++){
cout << 2 << ' ';
}
cout << y <<'\n';
}else if(b > 0 && b%2 == 1){
cout << "YES" << '\n';
for(int i = 0;i < k - 1;i ++){
cout << 1 << ' ';
}
cout << b <<'\n';
}else{
cout << "NO" <<'\n';
}
}
return 0;
}
C.
题意:求不能被n整除的第k大数为多少
思路:通过模拟样例我们发现 不能被n整除的数可分成一段一段的 共计有 k / (n - 1) 段 根据 k%(n - 1) 判断在答案在区间里的位置 如果余数为0 则答案就是 n * k / (n - 1) - 1 否则为 n * k/(n - 1) + k%(n-1)
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define mes(x,a) memset(x,a,sizeof(x));
#define sca(a) scanf("%d",&a)
#define lowbit(x) x & (-x)
#define mk make_pair
#define pb(x) push_back(x)
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define lson v << 1
#define rson v << 1 | 1
#define pii pair<int, int>
inline int read()
{
int x=0,flag_read=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
flag_read=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*flag_read;
}
int main()
{
int t;
cin >> t;
while(t --){
LL n , k ;
cin >> n >> k ;
LL x = k / (n - 1) ;
LL y = k % (n - 1) ;
LL res = 0;
if(y == 0){
res = n * x - 1;
}else{
res = n * x + y;
}
cout << res << '\n';
}
return 0;
}
D.
题意:有长度为n的糖果序列 每个位置i上有ai个糖果 有两个人 一个从左边开始吃 一个从右边开始吃
且每次吃都要比上个吃的多 问总移动次数 总共吃的糖果数
思路:双指针 对于一个人吃完后的结束条件 一个人在吃糖果时 当前指针移动 当结束的时候 当前指针所指的位置是那个人没有吃过的 后面的人可以吃 所以一个人吃完后的终止条件是 l > r 而不是 l >= r
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define mes(x, a) memset(x, a, sizeof(x));
#define sca(a) scanf("%d", &a)
#define lowbit(x) x&(-x)
#define mk make_pair
#define pb(x) push_back(x)
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define lson v << 1
#define rson v << 1 | 1
#define pii pair<int, int>
inline int read() {
int x = 0, flag_read = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') flag_read = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
x = (x << 3) + (x << 1) + c - '0';
c = getchar();
}
return x * flag_read;
}
int a[1005];
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int sa = 0;
int sb = 0;
int cnt = 0;
int l = 1, r = n;
int x = 0;
int sum = 0;
while (r >= l) {
sum = 0;
for (; l <= r;) {
sum += a[l];
l++;
if (sum > x) break;
}
sa += sum;
x = sum;
sum = 0;
cnt++;
if(l > r){
break;
}
for (; r >= l;) {
sum += a[r];
r--;
if (sum > x) break;
}
sb += sum;
x = sum;
cnt++;
}
cout << cnt << ' ' << sa << ' ' << sb << '\n';
}
return 0;
}
E.
题意:给出一个序列n 里面的数 均小于等于n 求序列里能与连续区间的和相等的数有多少
思路:连续区间的和 很容易想到前缀和优化一下 然后n*n 标记所有能被代表的数 最后求出总和 注意不能只有一个数
#include <bits/stdc++.h>
using namespace std;
int a[8005],sum[8005];
int main(){
int t ;
cin >> t;
while(t--){
int n ;cin >> n;
memset(sum,0,sizeof(sum));
for(int i = 1;i <= n;i ++){
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
bool vis[8005] = {0};
for(int i = 1;i <= n;i ++){
for(int j = 0;j < i - 1;j ++){
if(sum[i] - sum[j] <= n){
vis[sum[i] - sum[j]] = 1;
}
}
}
int res = 0;
for(int i = 1;i <= n;i ++){
if(vis[a[i]]){
res ++ ;
}
}
cout << res << '\n';
}
return 0;
}
F.
题意:构造一个01子序列 使得里面有a个00 b个01或者10 c个11
思路:先构造00 后 11 最后 01 要构造a个00很明显需要 a + 1个0 11也同理 对于01也是同理 但由于00 和 11 交接处 与 11 和 01 交界处 分别会产生一个01 所以需要b + 1 - 2 个 记得特判b为0的情况
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int a, b, c;
cin >> a >> b >> c;
if (b == 0) {
if (a){
for (int i = 0; i < a + 1; i++) {
cout << 0;
}
}
if (c){
for (int i = 0; i < c + 1; i++) {
cout << 1;
}
}
cout << '\n';
continue;
}
for (int i = 0; i < a + 1; i++) {
cout << 0;
}
for (int i = 0; i < c + 1; i++) {
cout << 1;
}
for (int i = 0; i < b - 1; i++) {
cout << i % 2;
}
cout << '\n';
}
return 0;
}
G.
题意:构造值为1~n的序列 相邻两个数的绝对值差 在二到四之间
思路:先由奇数来构造 最后用偶数
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n;cin >> n ;
if(n < 4){
cout << "-1" << '\n';
continue;
}
for(int i = n;i >= 1;i --){
if(i&1){
cout << i << ' ';
}
}
cout << "4 2 ";
for(int i = 6;i <= n;i += 2){
cout << i << ' ';
}
cout << '\n';
}
return 0;
}