10.6新生第四次娱乐场题解

7-1 多组输入教学

#include 
int main(){
    int T, a, b; 
    scanf("%d", &T); //首先把 T 读进来
    while (T--){ //放在while里,每次自减一次,会自减 T 次,就达到了循环 T 次的目的
        scanf("%d%d", &a, &b); //对于每次循环,进行输入,输出。
        printf("%d\n", a + b);
    }
    return 0;
}

7-2 “Hello World!”

考点:转义字符

#include 

int main(){
    printf("\"Hello World!\"");
    return 0;
}

7-3 房间

考点:思维

1.所有的人都住双人间
( n + 1 ) / 2 ∗ a (n + 1)/ 2 * a (n+1)/2a
2.所有人都住双人间,但是有一个人,自己住一个双人间。
拿出一个双人间的兄弟,三个人开一个三人间。
( n − 2 ) / 2 ∗ a + b (n - 2) / 2 * a + b (n2)/2a+b
3.所有人都住三人间
( n + 2 ) / 3 ∗ b (n + 2) / 3 * b (n+2)/3b
4.所有人都住三人间,但是有两个人住三人间,空一个床位
把这两个兄弟安排到一个双人间里去
n / 3 ∗ b + a n / 3 * b + a n/3b+a
5.所有人都住三人间,有一个人住三人间
拿出一个三人间的兄弟,这样就有4人,开两个双人间。
( n − 2 ) / 3 ∗ b + a + a (n - 2) / 3 * b + a + a (n2)/3b+a+a

#include 

int main(){
    int T;
    scanf("%d", &T);
    while (T--){
        long long n, a, b;
        scanf("%lld%lld%lld", &n, &a, &b);
        long long ans = 1e18;
        if ((n + 1) / 2 * a < ans)
            ans = (n + 1) / 2 * a;
        if ((n - 2) / 2 * a + b < ans)
            ans = (n - 2) / 2 * a + b;
        if ((n + 2) / 3 * b < ans)
            ans = (n + 2) / 3 * b;
        if (n / 3 * b + a < ans)
            ans = n / 3 * b + a;
        if ((n - 2) / 3 * b + a + a < ans)
            ans = (n - 2) / 3 * b + a + a;
        printf("%lld\n", ans);
       }
    return 0;
}

7-4 构造数字

考点:思维

12

121212121212…

12个12拼接在一起

各数位的和是12 * ( 1 + 2)
1
22
333
4444
55555
666666
输出 n n n n n n 就行了。

#include 

int main(){
    int T;
    scanf("%d", &T);
    while (T--){
        int n;
        scanf("%d", &n);
        for (int i = 1;i <= n; i++)
            printf("%d", n);
        printf("\n");
    }
    return 0;
}

7-5 取方格

考点:找规律

给的两个数,找到小的和大的,如果小的乘3 + 1 小于等于大的,就可以,否则就不行。

#include 

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        int x, y, Min, Max;
        scanf("%d%d", &x, &y);
        if (x < y) {
            Min = x;
            Max = y;
        } else {
            Max = x;
            Min = y;
        }
        if (Min * 3 + 1 < Max)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}

7-6 Max

考点: 思维 + 数学

给你n ,c 在 [ 1 , n ] [1 , n] [1,n],找到 a , b a, b a,b,且 g c d ( a , b ) = = c gcd(a , b) == c gcd(a,b)==c

n < c n < c n<c : a , b < c a, b < c a,b<c,两个小于 c c c 的数,他们的 g c d gcd gcd,一定不会等于 c c c。此种情况输出 − 1 -1 1

n n n [ c , 2 ∗ c ) [c, 2*c) [c,2c),这种情况 a = c , b = c a = c, b = c a=c,b=c,答案就是 c 2 c^2 c2

其它的情况:
让a ,b尽量的大,a , b都是c 的倍数。
n里包含的最大的C的倍数 n / c ∗ c n / c * c n/cc
a = n / c ∗ c a = n / c * c a=n/cc
b = a − c b = a - c b=ac

g c d ( a , b ) = = c ? gcd (a, b) == c ? gcd(a,b)==c?

a = n / c ∗ c , b = ( n / c − 1 ) ∗ c a = n / c * c,b = (n/c-1) * c a=n/cc,b=(n/c1)c

判断
n / c , n / c − 1 n / c ,n / c - 1 n/cn/c1
是否互质。
两个相邻自然数,一定互质。

所以
g c d ( a , b ) = = c gcd(a, b) == c gcd(a,b)==c

#include 

int main(){
    int T;
    scanf("%d", &T);
    while (T--){
        long long c, n, a, b;
        scanf("%lld%lld", &c, &n);
        if (n < c)
            printf("-1\n");
        else if (n >= c && n < 2 * c)
            printf("%lld\n", c * c);
        else
            printf("%lld\n", (n / c * c) * ((n / c - 1) * c));
    }
    return 0;
}

你可能感兴趣的:(比赛题解)