群赛11----2017.9.20

T1 The Wall

题意:

给出k,g,a,b四个数,问在ab范围内有多少个既是k的倍数,g的倍数的数。

解法:

暴力.

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a, b, c, d, bei;
    scanf("%d%d%d%d", &a, &b, &c, &d);
    bei = a / __gcd(a, b) * b;
    if (c % bei == 0)
        cout << d / bei - c / bei + 1;
    else
        cout << d / bei - c / bei;
    return 0;
}

网址:这一题

小结:

**此类题目水题。**

T2 Maximal Area Quadrilateral

题意:

给出k个点的坐标,问能组成的最大的正方形的面积。

解法:

几何.

代码:

#include <bits/stdc++.h>
using namespace std;
#define M 350
#define eps 0
#define inf 10000000000
int n, i, j, k;
double max1, max2, max3, yong;
struct node
{
    double x, y;
} p[M];
double jisuan(int i, int j, int k)
{
    return ((p[k].x - p[i].x) * (p[k].y - p[j].y) - (p[k].y - p[i].y) * (p[k].x - p[j].x)) / 2.0;
}
struct line
{
    void guochen()
    {
        for (j = 0; j < n; j++)
        {
            if (i == j)
                continue;
            max1 = -inf, max2 = -inf;
            for (k = 0; k < n; k++)
            {
                if (i == k || j == k)
                    continue;
                yong = jisuan(i, j, k);
                if (yong < eps)
                    max1 = max(max1, -yong);
                else
                    max2 = max(max2, yong);
            }
            max3 = max(max3, max1 + max2);
        }
    }
} hanshu;
int main()
{
    cin >> n;
    for (i = 0; i < n; i++)
        scanf("%lf%lf", &p[i].x, &p[i].y);
    max1 = -inf, max2 = -inf, max3 = -inf;
    for (i = 0; i < n; i++)
        hanshu.guochen();
    printf("%.6f\n", max3);
    return 0;
}

网址:这一题

小结:

**此类题目暴力。**

T3 Tourist Problem

题意:

给出几个点在一条线上,两个点的距离是两个点的坐标差,输出所有走法的和除以走法数的分子和分母。

解法:

暴力优化。

代码:

#include "bits/stdc++.h"
using namespace std;
#define LL long long
#define N 10000000
LL a[N + 1];
LL s1 = 0, s2 = 0, s3 = 0, ans, p, q;
int main()
{
    LL n;
    cin >> n;
    for (LL i = 1; i <= n; i++)
    {
        cin >> a[i];
        s1 += a[i];
    }
    sort(a + 1, a + n + 1);
    for (LL i = 1; i <= n; i++)
    {
        if (i > 1)
            s3 += a[i - 1];
        s2 += ((i - 1) * a[i] - s3);
    }
    ans = s2 * 2 + s1;
    p = ans / (__gcd(ans, n));
    q = n / (__gcd(ans, n));
    cout << p << " " << q;
}

网址:这一题

小结:

**此类题目优化。**

T4 Bubble Sort Graph

题意:

给你一个数列,利用冒泡排序,将交换的两个数相联系,问有一个子集,其内的元素一一无关,输出最大的子集大小。

解法:

归并排序

代码:

#include <bits/stdc++.h>
using namespace std;
#define N 500000
int a[N],d[N];
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    if (n == 0)
    {
        printf("0\n");
        return 0;
    }
    d[1] = a[1];
    int len = 1;
    for (int i = 2; i <= n; i++)
    {
        if (a[i] >= d[len])
            d[++len] = a[i];
        else
        {
            int j = upper_bound(d + 1, d + len + 1, a[i]) - d;
            d[j] = a[i];
        }
    }
    printf("%d\n", len);
    return 0;
}

网址:这一题

小结:

**此类题目较水。**

T5 Iahub and Permutations

题意:

自己看,不会讲.(错排加强版)

解法:

根据题意写就行了,找规律。

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int p = 1e9 + 7;
ll f[2010], gg[2010];
int sum = 0, num = 0, a[2010], n;
int main()
{
    scanf("%d", &n);
    gg[0] = 1;
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &a[i]);
        if (a[i] == -1)
            sum++;
    }
    for (int i = 1; i <= n; ++i)
        if (a[i] != -1 && a[a[i]] == -1)
            num++;
    for (int i = 1; i <= num; ++i)
        gg[i] = gg[i - 1] * i % p;
    int t = sum - num;
    f[0] = gg[num];
    for (int i = 1; i <= t; ++i)
    {
        f[i] = ((num + i - 1) * f[i - 1]) % p;
        if (i > 1)
            f[i] = (f[i] + (i - 1) * f[i - 2]) % p;
    }
    printf("%lld", f[t]);
}

网址:这一题

小结:

**此类题目较难。**
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值