SDKD Summer Team Contest C

E:点击打开链接

开始的时候a.s = s;错误;结构体排序忘了,用的冒泡,各种不爽啊当时;

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int maxn = 200 + 5;
struct person
{
    char s[55];
    int kill;
    int major;
    int minor;
}vis[maxn];
vector<string> res;
int main()
{
    int N;
    while(cin >> N && N)
    {
        memset(vis,0,sizeof(vis));
        res.clear();
        for(int i  = 0; i < N;i++)
        {
            char s[55];
            int kill;
            cin >> s >> kill;
            memcpy(vis[i].s, s, sizeof(s));
            vis[i].kill = kill;

        }
        for(int i = 0; i < N-1; ++i)
        {
            for(int j = i + 1; j <N;++j )
            {
                person tmp;
                if(vis[i].kill < vis[j].kill)
                {
                    tmp = vis[i];
                    vis[i]= vis[j];
                    vis[j] = tmp;
                }
                else if(vis[i].kill == vis[j].kill && strcmp(vis[i].s, vis[j].s) == 1)
                {
                    tmp = vis[i];
                    vis[i]= vis[j];
                    vis[j] = tmp;
                }
            }
        }
        for(int i = 0; i < N; ++i)
        {
            cout << vis[i].s << " " << vis[i].kill << endl;
        }
        int M;
        cin >> M;
        for(int i = 0; i < M;++i)
        {
            char ss[55];
            cin >> ss;
            int ok;
            for(int i = 0; i < N;++i)
            {
                if(strcmp(ss,vis[i].s) == 0) { ok = vis[i].kill;break;}
            }
            int a = 1, b = 1;
            for(int i = 0; i < N; ++i)
            {
                if(vis[i].kill > ok) ++a;
                else if(vis[i].kill == ok)
                {
                    if(strcmp(vis[i].s, ss) == -1) ++b;
                }
            }
            cout << a;
            if(b != 1)
            {
                cout << " " << b <<endl;
            }
            else cout <<"\n";
        }
    }
    return 0;
}
I: 点击打开链接

贪心; 状态压缩;

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define EPS 1e-6
using namespace std;
const int maxn = 10000;
int res[maxn];
int used[maxn];
int n;
double sum = 0;
int ok(int a, int b, int c)
{
    int kkk[3];
    kkk[0] = a;
    kkk[1] = b;
    kkk[2] = c;
    sort(kkk,kkk+3);
    a = kkk[0];
    b = kkk[1];
    c = kkk[2];
    if(a+b <= c || c- a > b || c-b>a) return 0;
    return 1;
}
int main()
{
    while(cin >> n &&n)
    {
        memset(used,0,sizeof(used));
        for(int i = 1; i <= n;++i) cin >> res[i];
        int k = n/3;
        sum = 0;
        while(k--)
        {
            double tmp = 0;
            int a = 0, b = 0, c =0;
            for(int i = 1; i <= n; ++i)
            {
                for(int j = i + 1; j <= n;++j)
                {
                    for(int kk = j + 1; kk <= n;++kk)
                    {
                        if(!used[i] && !used[j] && !used[kk] && ok(res[i], res[j], res[kk]))
                        {
                            double kkkk = double(res[i]+res[j]+res[kk])/2;
                            double t = kkkk * (kkkk-(double)res[i]) * (kkkk-(double)res[j]) * (kkkk-(double)res[kk]);
                            if(tmp < t)
                            {
                                a = i;
                                b = j;
                                c = kk;
                                tmp = t;
                            }
                        }
                    }
                }
            }
            used[a] = used[b] = used[c]  = 1;
            sum += sqrt(tmp);
        }
        printf("%.2lf\n", sum);
    }
    return 0;
}

状态压缩:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int maxn = (1<<13) - 1;
int n;
double dp[maxn];
int res[13];
vector<int>v;
double area(int a, int b, int c)
{
    if(a+b <= c) return 0.0;
    else
    {
        double p = (a + b + c) * 0.5;
        return sqrt(p * (p-a) * 1.0 * (p-b) * 1.0 * (p-c) * 1.0);
    }
}
int main()
{
    while(cin >> n && n)
    {
        memset(dp,0,sizeof(dp));
        v.clear();
        for(int i = 0; i < n; ++i) cin >> res[i];
        sort(res,res+n);
        for(int i = 0; i < n; ++i)
        {
            for(int j = i + 1; j < n;++j)
            {
                for(int k = j + 1; k < n;++k)
                {
                    int st = (1<<i) | (1<<j) | (1<<k);
                    dp[st] = area(res[i], res[j], res[k]);
                    if(res[i] + res[j] > res[k]) v.push_back(st);
                }
            }
        }
        int max_case = 0;
        for(int i = 0; i < (1<<n); ++i)
        {
            for(int j = 0; j < (int)v.size(); ++j)
            {
                if((i&v[j])) continue;
                dp[(i|v[j])] = max(dp[(i|v[j])], dp[i] + dp[v[j]]);
            }
        }
        printf("%.2lf\n", dp[(1<<n) - 1]);
    }
    return 0;
}

K: 点击打开链接

很久没有bfs了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 300 + 5;
int d[maxn][maxn];
int tmp[maxn][maxn];
int res[maxn][maxn];
int N, M;
int bfs(int i)
{
    queue<int> que;
    while(!que.empty()) que.pop();
    for(int j = 2; j <= N; ++j)
        if(res[1][j] != 0 && j != i)
            que.push(j);
    int haved[maxn];
    memset(haved,0,sizeof(haved));
    while(!que.empty())
    {
        int d = que.front();que.pop();
        if(d == N) return 1;
        haved[d] = 1;
        for(int j = 2; j <= N; ++j)
            if(res[d][j] != 0 && !haved[j] && j != i)
                que.push(j);
    }
    return 0;
}
int Floyd_Warshall(int kk)
{
    for(int k = 1; k <= N; ++k)
    {
        if(k == kk)continue;
        for(int i = 1; i <= N; ++i)
        {
            for(int j = 1; j <= N; ++j)
            {
                tmp[i][j] = min(tmp[i][j], tmp[i][k] + tmp[k][j]);
            }
        }
    }
    return tmp[1][N];
}
int main()
{
    while(cin >> N >> M)
    {
        memset(d,INF,sizeof(d));
        memset(res,0,sizeof(res));
        if(N==0 && M==0) return 0;
        if(M==0 && N != 0) {cout << "Inf" << endl;continue;}
        for(int i = 0; i < M;++i)
        {
            int u, v, k;
            cin >> u >> v;
            cin >> k;
            d[u][v] = k;
            d[v][u] = k;
            res[u][v] = 1;
            res[v][u] = 1;
        }
        bool ok = true;
        for(int i = 2; i <= N-1; ++i)
        {
            if(!bfs(i)){ok = false; break;}
        }

        if(!ok) {cout << "Inf" << endl;continue;}

        int sum = 0;
        memcpy(tmp,d,sizeof(d));
        for(int i = 2; i <= N-1; ++i)
        {

            sum = max(sum, Floyd_Warshall(i));
            memcpy(tmp,d,sizeof(d));
        }
        cout << sum << endl;
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值