当前位置:网站首页>CDZSC_ 2022 winter vacation personal training match level 21 (1)

CDZSC_ 2022 winter vacation personal training match level 21 (1)

2022-07-07 09:48:00 moyangxian

A

The question : A little

Answer key : take n Divide the sum of the numbers by n that will do .

#include<bits/stdc++.h>

using namespace std;

signed main(){
    
    int n;
    scanf("%d", &n);
    int sum = 0;
    for(int i = 1; i <= n; i++){
    
        int x;
        scanf("%d", &x);
        sum += x;
    }
    printf("%.10f\n", sum * 1.0 / n);
    return 0;
}

B

The question : A little

Answer key : Since the minimum value is required , So give priority to large denomination money .

#include<bits/stdc++.h>

using namespace std;
int a[] = {
    100, 20, 10, 5, 1};

signed main(){
    
    int n;
    scanf("%d", &n);
    int ans = 0;
    for(int i = 0; i < 5; i++){
    
        ans += n / a[i];
        n %= a[i];
    }
    printf("%d\n", ans);
    return 0;
}

C

The question : A little

Knowledge point :STL Application

Answer key : Splice the string with yourself , Equivalent to length times 2; for example :abcd -> abcdabcd
Then take out each one with a length of len( The length of the original string ) String , use map Just record it .

#include<bits/stdc++.h>

using namespace std;
map<string, int> mp;

signed main(){
    
    string s;
    cin >> s;
    int len = s.length();
    s += s;
    int ans = 0;
    for(int i = 0; i < len; i++){
    
        string t = s.substr(i, len);
        if(mp[t] == 0) ans++;
        mp[t]++;
    }
    printf("%d\n", ans);
    return 0;
}

D

The question : A little

Answer key : because 6 = 2 * 3, So take a ride 2 except 6 The operation of is equivalent to dividing by 3, So the operation turns into a one-step operation to n Divide 6 Or two steps will n Divide 3, If n It cannot be changed into 1 There is no solution. .

#include<bits/stdc++.h>

using namespace std;

void solve(){
    
    int n;
    scanf("%d", &n);
    int ans = 0;
    while(true){
    
        if(n % 6 == 0){
    
            n /= 6;
            ans++;
        }
        else if(n % 3 == 0){
    
            n /= 3;
            ans += 2;
        }
        else{
    
            break;
        }
    }
    if(n == 1) printf("%d\n", ans);
    else printf("-1\n");
}

signed main(){
    
    int T;
    scanf("%d", &T);
    while(T--) solve();
    return 0;
}

E

The question : A little

Answer key : Choose the smallest number each time to subtract , It is equivalent to subtracting each number after arranging the array in order , And if a number appears many times, it will only be subtracted once . For each of these a[i] for , The array subtracts the difference between it and the previous one , namely a[i] - a[i - 1]

#include<bits/stdc++.h>

using namespace std;
const int N = 1e5 + 10;
int a[N];

signed main(){
    
    int n, k;
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    sort(a + 1, a + 1 + n);
    n = unique(a + 1, a + 1 + n) - a - 1;
    for(int i = 1; i <= k; i++){
    
        if(i <= n) printf("%d\n", a[i] - a[i - 1]);
        else printf("0\n");
    }
    return 0;
}

F

The question : A little

Answer key : If n The sum of the numbers is not 0, Then I will n The number can be divided into one section . If n The sum of the numbers is 0, Then find the last not for 0 Number of numbers ( Subscript to be pos), take (1,pos - 1) Divide into sections ,(pos, n) It can be divided into sections .

#include<bits/stdc++.h>

using namespace std;
const int N = 110;
int a[N];

signed main(){
    
    int n;
    scanf("%d", &n);
    int sum = 0;
    for(int i = 1; i <= n; i++){
    
        scanf("%d", &a[i]);
        sum += a[i];
    }
    if(sum){
    
        printf("YES\n");
        printf("1\n");
        printf("1 %d\n", n);
    }
    else{
    
        int pos = -1;
        for(int i = 1; i <= n; i++)
            if(a[i]) pos = i;
        if(pos == -1) printf("NO\n");
        else{
    
            printf("YES\n");
            printf("2\n");
            printf("1 %d\n", pos - 1);
            printf("%d %d\n", pos, n);
        }
    }
    return 0;
}

G

The question : A little

Answer key : Because the array finally forms an arithmetic sequence , We can enumerate a[1] You can know the value of the entire array , Compare the obtained array with the original array , Record the number of different numbers , The answer is the optimal solution .

#include<bits/stdc++.h>

using namespace std;
const int N = 1010;
int a[N], b[N], t[N];

signed main(){
    
    int n, k;
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    int ans = n;
    for(int i = 1; i <= 1000; i++){
    
        b[1] = i;
        int cnt = 0;
        for(int j = 1; j <= n; j++){
    
            b[j] = b[1] + (j - 1) * k;
            if(b[j] != a[j]) cnt++;
        }
        if(cnt < ans){
    
            memcpy(t, b, sizeof(b));
            ans = cnt;
        }
    }
    printf("%d\n", ans);
    for(int i = 1; i <= n; i++){
    
        if(t[i] > a[i]) printf("+ %d %d\n", i, t[i] - a[i]);
        else if(t[i] < a[i]) printf("- %d %d\n", i, a[i] - t[i]);
    }
    return 0;
}
原网站

版权声明
本文为[moyangxian]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207070709200395.html