2014icpc广州个人题解

E C语言级别 排序一下按题目要求输出就好 随意操作完全不卡时间

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

struct vi{ char s[55]; int x; }a[222];

bool cmp(vi q,vi w)

{

    if (q.x == w.x)

        return strcmp(q.s, w.s) < 0;

    return q.x > w.x;

}

int main()

{

    int n, i, m, j;

    char ss[55];

    while (scanf("%d", &n) && n)

    {

        for (i = 0; i < n; i++)

            scanf("%s%d", a[i].s, &a[i].x);

        sort(a, a + n, cmp);

        for (i = 0; i < n; i++)

            printf("%s %d\n", a[i].s, a[i].x);

        scanf("%d", &m);

        while (m--&&scanf("%s", ss))

        {

            for (i = 0; i < n; i++)

                if (strcmp(ss, a[i].s) == 0)

                    break;

            j = i - 1;

            while (a[j].x == a[i].x)

                j--;

            printf("%d", j + 2);

            if (j != i - 1)

                printf(" %d", i - j);

            puts("");

        }

    }

}

 

K 同巨水题

求去掉1点后2点间的最短路的最大值 但数据太小 暴力floyd最短路加枚举就好O(n^4) 没什么坑点 虽然很容易想到O(n^2logm)的算法

现场应该40min内写完这2题的..

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

int mp[33][33], mm[33][33], i, j, k, q, ans, n, m, x, y, z;

int main()

{

    while (scanf("%d%d", &n, &m) && n + m)

    {

        for (i = 0; i <= n; i++)

            for (j = 0; j <= n; j++)

                mp[i][j] = 1 << 25;

        for (i = 0; i < m; i++)

        {

            scanf("%d%d%d", &x, &y, &z);

            mp[x][y] = mp[y][x] = min(mp[x][y], z);

        }

        ans = -1;

        for (q = 2; q < n; q++)

        {

            memcpy(mm, mp, sizeof(mm));

            for (k = 1; k <= n; k++)

                for (i = 1; i <= n; i++)

                    for (j = 1; j <= n; j++)

                        if (i != q&&j != q&&k != q&&mm[i][k]!=1<<25&&mm[k][j]!=1<<25)

                            mm[i][j] = mm[j][i] = min(mm[i][j], mm[i][k] + mm[k][j]);

            ans = max(ans, mm[1][n]);

        }

        if (ans >= 1 << 25)

            puts("Inf");

        else printf("%d\n", ans);

    }

}

 

I 简单智力题

当时的做法是倒序排序贪心 是最简单的

现在做一遍居然状态压缩啥的各种操作...

#include<cstdio>

#include<cstring>

#include<cmath>

#include<algorithm>

using namespace std;

int a[15], i, n;

double ans;

double f(int a, int b, int c)

{

    double q = (a + b + c) / 2.0;

    return sqrt(q*(q - a)*(q - b)*(q - c));

}

int cmp(int x, int y)

{

    return x > y;

}

int main()

{

    while (scanf("%d", &n) && n)

    {

        for (i = 0; i < n; i++)

            scanf("%d", a + i);

        sort(a, a + n, cmp), ans = 0;

        for (i = 2; i < n;)

            if (a[i] + a[i - 1] > a[i - 2])

                ans += f(a[i], a[i - 1], a[i - 2]), i += 3;

            else i++;

            printf("%.2lf\n", ans);

    }

}

手速铜牌题

 

D 被我很快理论ac但没模板就没写的题..

容易算出到ab2点距离比为k的范围是一个圆(高中数学) 然后套圆和多边形交的模板就好

有模板的话30min内应该可过的..

稳银牌题

 

之后是有点难的数学+数论题复杂数据结构题(玄学暴力可过)..

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值