现在的位置: 首页 > 综合 > 正文

2013年3月17日 周赛 解题报告 — from lanshui_Yang

2019年01月08日 ⁄ 综合 ⁄ 共 1096字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 100005;
const int INF = 0x7fffffff;
struct pp    
{
    char name[25];
    int fen ;
} s[MAXN] ,s2[MAXN];
int f[20] ;
int main()
{
    int n , m , g ;
    while (scanf("%d",&n) != EOF)
    {
        if(n == 0)
            break ;
        scanf("%d%d",&m,&g);
        int i;
        for(i = 1 ; i <= m ; i ++)
        {
            scanf("%d",&f[i]);
        }
        for(i = 0; i < n ; i ++)
        {
            int sum = 0;
            scanf("%s",s[i].name);
            int h ;
            scanf("%d",&h);
            for(int j = 0 ; j < h ; j++)
            {
                int tmp;
                scanf("%d",&tmp);
                sum += f[tmp];
            }
            s[i].fen = sum ;
            sum = 0 ;
        }
        int k;
        int cnt = 0;
        for(i = 0 ; i < n ; i ++)   // 主要部分 : 选择排序
        {
            int max = -1 ;
            int xu = i ;
            int pan = 0;
            for(k = i ; k < n ; k ++)
            {
                if(s[k].fen >= g)  // 排序的条件 
                {
                    pan = 1;
                    if(max < s[k].fen)   // 按分数的大小排序
                    {
                        max = s[k].fen ;
                        xu = k;
                    }
                    else if(max == s[k].fen)
                    {
                        int kk = strcmp(s[k].name,s[xu].name);   //如果分数相同,则根据学号的前后排序
                        if(kk == -1)
                        {
                            xu = k ;
                        }
                    }
                }
            }
            if(pan == 1)
            {
                s2[cnt].fen = max ;
                strcpy(s2[cnt].name ,s[xu].name);
                strcpy(s[xu].name , s[i].name);
                s[xu].fen = s[i].fen ;
                cnt ++;
            }
        }
        printf("%d\n",cnt);
        for(i = 0 ; i < cnt ; i++)
        {
            cout << s2[i].name ;
            printf(" %d\n",s2[i].fen);
        }
    }
    return 0 ;
}

    这次 的周赛 主要 考察 手写排序 , 不能用STL , 在除了PROBLEM   F   的其他题目中 ,我均是使用  选择排序 解答的 ,个人感觉,选择排序 比冒泡 好用多了, 用选择排序比较容易手写结构体排序,对于 PROBLEM   F ,我使用选择排序 老是TLE , 原因是 不会 手写 快排, 所以 要尽快 掌握啊 ,那么接下来就来谈谈 PROBLEM E 的解题新的吧,因为这道题 充分考察了结构体的排序 和 字符串的 应用 。 请看上述代码 。。

抱歉!评论已关闭.