2019 ICPC-- 女生专场重现赛

目录

B - gcd

 ​​​​​B-gcd

G-Circle

J-Tangram

K-Tetris


 

B - gcd

 ​​​​​B-gcd

wls 有一个整数 nn,他想将 1 -− nn 这 nn 个数字分成两组,每一组至少有一个数,并且使得两组数字的和的最大公约数最大,请输出最大的最大公约数。

Input

输入一行一个整数 nn。
2 ≤ nn ≤ 1, 000, 000, 000

Output

输出一行一个整数表示答案。

input 6

output 7

思路:把所有数字加起来,和设为sum,再把sum分成尽可能小的份,再保证每一份之间都存在公约数,就是分成i份,每份都是sum/i,然后随机组合成两组,则它们一定有公约数。

再就是如何保证是最大的,就是分成尽可能小的份了。

 再者,如果它除不尽会不会存在最大公约数呢?会存在,比如21除以2除不尽,但是7 14是答案分组,但是它还可以再分,分完还是符合原思路,所以原来的思路涵盖了这个思路。

栗子:比如21分成7和14,但是我们想要找到它们俩的最大公约数,就要找到7,所以要分成3份,也就找到了它们的最大公约数。

代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    cin >> n;
    long long i;
    long long sum = n*(1 + n)/2;
    for(i = 2; i <= sum; i ++)
    {
        if(sum%i==0)
        {
            printf("%lld\n", sum/i);
            return 0;
        }
    }
}

G-Circle

G-Circle

在半径为 1 的圆上有 nn 个点,它们也是圆的 nn 等分点,将每个相邻的 nn 等分点相连,组成了一个正 nn边形,现在你可以在圆上再增加一个点,使得新的 nn + 1 边形的面积最大,请输出最大面积。

Input

输入有多组(不超过 100 组)。
每组数据一行一个整数 nn 代表点的数量。
3 ≤ nn ≤ 100

Output

每组数据输出一行一个数表示加上一个点后的最大面积,结果保留6位小数。

思路:正n边形面积公式:n/2 * r^2 * sin(2*Π/n);

然后把正n边形分成n个三角形,再把其中一个三角形剔除,然后在这个三角形的圆心角的角平分线与圆的交点处再与三角形在圆上的两点连接,形成一个四边形,此时这个四边形是个菱形,面积是对角线乘积的一半,为最大的多边形。

公式为(n-1)/2 * r^2 * sin(2*Π/n) + r^2 * sin(Π/n)

代码

#include <bits/stdc++.h>
#define PI acos(-1)
using namespace std;

int main() {
    double n;
    while (scanf("%lf", &n) != EOF)
    {
        double ans = 0.5 * (n - 1) * sin(2 * PI / n) + sin(PI / n);
        printf("%.6f\n", ans);
    }
    return 0;
}

J-Tangram

J - Tangram

一块七巧板有 7 块,现在 wls 想再在七巧板上加 n 条直线将七巧板切分并且使得切出来的块最多,请问最多能有多少块?

Input

输入有多组(不超过 100, 000组)。
每组一行一个正整数 n。
0 ≤ n ≤ 1, 000, 000, 000

Output

每组输出一行一个数代表答案。

Sample Input

1

Sample Output

13

 思路:在红色四边形那里切,可以通过5条边,切出的分块最多,然后第一次多切出6块,第二次比第一次多7块,以此累加,然后通过数列求和。

代码:

#include <bits/stdc++.h>
#define PI acos(-1)
using namespace std;

int main() {
    long long n, i, ans;
    while (cin >> n) {
        ans = 7 + (6 + n + 6 - 1) * n / 2;
        printf("%lld\n", ans);
    }
    return 0;
}

K-Tetris

K-Tetris

wls 有一个 n &#8727; m 的网格,他现在想用俄罗斯方块中的"凸"型密铺它。


一个"凸"型占四个格子,你可以随意把它调成上下左右四个方向中的一个。
密铺的定义是网格中任意一个格子被且只被一个"凸"型铺到,并且这些"凸"型不能铺出网格的边界。
随意输出一组解即可。

Input

一行两个整数 n, m。
1 ≤ n, m ≤ 12

Output

无解输出 no response。
如果有解,输出 n 行,每行 m 个字符。你只能使用 1, 2, 3, 4 这四个字符,由同 一字符组成的四连通块被视为一个"凸"型。
如果有多组解,那么输出任意一种即可。

思路:只能是被4整除的数才能找到这种规律,其他的都不行;

代码:

#include <bits/stdc++.h>

using namespace std;

int a[4][4] = {{1, 1, 1, 3}, {2, 1, 3, 3},{2, 2, 4, 3}, {2, 4, 4, 4}};
int main()
{
    int n, m;
    while(cin >> n >> m)
    {
        if (n % 4 || m % 4) 
        {
            cout << "no response\n";
            continue;
        }
        int i, j;
        for(i = 0; i < n; i ++)
        {
            for(j = 0; j < m; j ++)
            {
                printf("%d", a[i%4][j%4]);
            }
            cout << "\n";
        }
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值