Croc Champ 2012 - Round 2 (Unofficial Div. 2 Edition) 部分解题报告。

rating继续跌。。。。。桑心啊!!

http://codeforces.com/contest/181

A:就是给一个矩阵,里面有四个点这四个点能够组成矩形,给定三个点求第四各点的位置。这里四点形成矩形的边与给定矩形的边平行。所以只要简单的模拟找出来就行。如果不平行的话就麻烦了。

*     *

*     ?不管怎样都是这样的形式。。

View Code

B:给定N个点,求满足三点共线且中间一点位于其余两点的中点的所有三点组合的个数。ABC ,B位于AC的中点。

才开始自己写了个((n*(n-1))/2)*(logn)的,就是两点组合后在二分查找是否存在,可是老是wa,郁闷了,于是就换了算法。同样首先排序,1 2 3 4 5 6 7 8 9然后是1 与2 3 4 5 6 7 8 9组合由

xc = 2*xb - xa yc = 2*yb - ya 求出xc,yc后然后往后查找,直到找到该点,或者找到一个大于该点的点停止,记录此时的位置,下一次1 3 组合时直接从该位置直接查找即可,因为1与3的组合求出的点肯定会大于等于1 与2 组合求出的点。。

赛后看了一下别人的代码,原来只要开一个visit[][]数组来记录已有的,计算出b点时只要查看一下有没有就可以了,注意把-1000变换整数就行了(加个偏移量),我的麻烦了。

View Code

C:就是一个贪心题目,只是自己的编码能力太差,时间不够了,编完代码,样例过后,就剩12m了,心急就提交了,WA1心想怎么会呢,样例明明过了,一看重定向在编译器了去了,可是没有保存郁闷啊。今天早上来到实验室,修改了3出及其低级的错误,就A了。。唉。自己的能力还是有待提高的。。。

遍历所有的星球,然后每两个求出他们的商品的利润值(b - a),然后从大到小排序,然后就是取商品了,注意k的限制。

View Code
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#define maxn 107
using namespace std;

struct wp
{
    int a,b,c;
};
struct xq
{
    wp p[maxn];
}q[12];
struct node
{
    int num;
    int len;
}t[maxn];
int n,m,k;

int cmp(node a,node b)
{
    return a.len > b.len;
}
int solve(int x,int y)
{
    int i;
    for (i = 0; i < m; ++i)
    {
        t[i].num = i;
        t[i].len = q[y].p[i].b - q[x].p[i].a;//求出每个商品的利润
    }
    /*for (i = 0; i < m; ++i)
    printf(">>>%d %d %d %d %d\n",t[i].num,t[i].len,q[x].p[t[i].num].a,q[x].p[t[i].num].b,q[x]. p[t[i].num].c);*/
    sort(t,t + m,cmp);//按理润从大到小排序
    /*for (i = 0; i < m; ++i)
    printf(">>>%d %d\n",t[i].num,t[i].len);
    printf("**********************************\n");*/
    int sum = 0;
    i = 0;
    int ct = k;
    while (i < m)
    {
        if (q[x].p[t[i].num].c < ct && t[i].len > 0)
        {
            //printf("@>>>>>>>>>>>%d\n",q[x].p[i].c);
            sum += t[i].len*(q[x].p[t[i].num].c );
            ct -= q[x].p[t[i].num].c ;
        }
        else
        break;
        i++;
    }
    //printf(">>>>>>>>>>>%d\n",ct);
    if (ct > 0 && t[i].len > 0)//没装满,但是还有空间
    sum += t[i].len*(ct);
    return sum;

}
int main()
{
    //freopen("in.txt","r",stdin);
    int i,j;
    char s[12];
    while (scanf("%d%d%d",&n,&m,&k) != EOF)
    {
        for (i = 0; i < n; ++i)
        {
              scanf("%s",s);
              for (j = 0; j < m; ++j)
              {
                  scanf("%d%d%d",&q[i].p[j].a,&q[i].p[j].b,&q[i].p[j].c);
              }
        }
        int ans = - 999999;
        for (i = 0; i < n; ++i)
        {
            for (j = 0; j < n; ++j)
            {
                if (i == j) continue;
                int tmp = solve(i,j);
                if (ans < tmp) ans = tmp;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
posted @ 2012-04-21 10:31  E_star  阅读(264)  评论(0编辑  收藏  举报