2012 winter training @HIT Day 1 解题报告

今天是第一天acm冬训,这次冬训主要是学习知识,而且是第一天,也是为了照顾11级没有基础的新同学,题目都很水。

http://acm.hit.edu.cn/hoj/contest/view?id=100127

 

所有题目都没有标题,标题是我自己加的……

第一题:Gifts of Peter's friends

读懂题就应该能敲出代码了,就是有的同学抱怨这题的英文写的比较烂,据说这英文是俄罗斯人写的。。

核心步骤就是把数据当下标,下标变数据。

/*This Code is Submitted by acehypocrisy for Problem 4000082 at 2012-01-18 16:44:29*/
#include <stdio.h>

int output[100];
int n;
int main()
{
    while(scanf("%d", &n) == 1){
        int i;
        for (i = 0; i < n; i++){
            int temp;
            scanf("%d", &temp);
            output[temp - 1] = i + 1;
        }
        for (i = 0; i < n; i++){
            printf("%d", output[i]);
            if (i == n - 1){
                printf("\n");
            }else
                printf(" ");
        }
    }
    return 0;
}
 

 

第二题:Peter and his Photos & Postcards

一个字符一个字符地判断,记录上一个字符和当前字符重复的次数。和上一个字符一样计数++,不一样或者计数大于5 Peter就要跑一趟了……

另外题目下面有NOTE,是给的另一种思路。

/*This Code is Submitted by acehypocrisy for Problem 4000083 at 2012-01-18 17:12:12*/
#include <stdio.h>
#include <string.h>

int main()
{
    char input[101];
    while (scanf("%s", input) == 1){
        unsigned int i;
        int count = 0, thisCh = 0;
        char last;
        for(i = 0; i < strlen(input); i++){
            if (i == 0){
                last = input[0];
                thisCh++;
                continue;
            }
            if (input[i] == last){
                thisCh++;
                if (thisCh > 5){
                    count++;
                    thisCh = 1;
                }
            }else{
                count++;
                thisCh = 1;
                last = input[i];
            }
        }
        count++;
        printf("%d\n", count);
    }
    return 0;
}
 

 

第三题:Teams' Ranklists of ACM/ICPC Regional Contest

acm竞赛的排名标准,更像是一道和工程有关的题,而不是算法。。。另外要在输入数据的地方做一下注意。排序可以直接使用STL的sort,自己写一个排序的函数。还有一个地方要注意,是按照字典顺序而不是字母表顺序,也就是说不区分大小写的;相关的问题是strlwr函数,这个函数不是标准库函数,只在windows的某些编译器的库中存在,提交到oj连编译这关都过不了……可以使用transform函数。感谢范利鑫学长指点

/*This Code is Submitted by acehypocrisy for Problem 4000084 at 2012-01-18 19:14:26*/
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;

struct Team{
    char name[30];
    bool problem_issolved[9];
    int problem_wacount[9];
    int problem_actime[9];
    int sproblem_num;
    int penalty;
};




bool compare(const Team& a, const Team& b){
    if (a.sproblem_num < b.sproblem_num){
        return false;
    }else if (a.sproblem_num > b.sproblem_num){
        return true;
    }else{
        if(a.penalty < b.penalty)
            return true;
        else if (a.penalty > b.penalty)
            return false;
        else{
            char an[30], bn[30];
            strcpy(an, a.name);
            strcpy(bn, b.name);
            int i;
            for (i = 0; i < strlen(an); i++){
                if (an[i] >= 'A' && an[i] <= 'Z')
                    an[i] += 'a' - 'A';
            }
            for (i = 0; i < strlen(bn); i++){
                if (bn[i] >= 'A' && bn[i] <= 'Z')
                    bn[i] += 'a' - 'A';
            }
            if (strcmp(an, bn) < 0)
                return true;
            return false;
        }
    }
}

int main()
{
    int m,n;
    while (scanf("%d %d", &n, &m) == 2){
        vector<Team> teams;
        int i;
        for (i = 0; i < n; i++){
            Team temp;
            memset(&temp, 0, sizeof(temp));
            scanf("%s", temp.name);
            teams.push_back(temp);
        }
        for  (i = 0; i < m; i++){
            char t[5];
            int h,m,s, total_s;
            char state[10];
            char name[30];
            scanf("%s %d:%d:%d %s %s", t, &h, &m, &s, state, name);
            total_s = 3600 * h + 60 * m + s;
            int a;
            for (a = 0; a < n; a++){
                if (strcmp(name, teams[a].name) == 0){
                    if (strcmp(state, "AC") == 0){
                        if (teams[a].problem_issolved[t[0] - 'A'] == false){
                            teams[a].problem_issolved[t[0] - 'A'] = true;
                            teams[a].sproblem_num++;
                            teams[a].problem_actime[t[0] - 'A'] = total_s;
                        }
                    }else{
                        if (teams[a].problem_issolved[t[0] - 'A'] == false){
                            teams[a].problem_wacount[t[0] - 'A']++;
                        }
                    }
                    break;
                }
            }
        }
        for(i = 0; i < n; i++){
            int j;
            for (j = 0; j < 9; j++){
                if (teams[i].problem_issolved[j]){
                    teams[i].penalty += 20 * 60 * teams[i].problem_wacount[j];
                    teams[i].penalty += teams[i].problem_actime[j];
                }
            }
        }
        sort(teams.begin(), teams.end(), compare);
        for(i = 0; i < teams.size(); i++){
            printf("%s\n", teams[i].name);
        }
        printf("\n");

    }
    return 0;
}
 

 

第四题:Finding Points

简单的排序问题,首按y坐标排序,次按x坐标排序。不过需要注意的是这样排好后最后一个元素并不是我们需要的元素,还应该再有一个从后向前查找具有最小x最大y的那个元素。另外在输出的问题上,最最简单的办法就是。。。把输入当做字符串存起来!什么格式问题全都无视掉。不知道算不算是投机取巧。。

/*This Code is Submitted by acehypocrisy for Problem 4000085 at 2012-01-18 17:43:40*/
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;

struct input{
    char coord[10000];
    double x;
    double y;
};


bool compare(const input& a, const input& b){
    if (a.y == b.y){
        if (a.x - b.x < 1e-10){
            return true;
        }
        return false;
    }else if (a.y - b.y < 1e-10){
        return true;
    }else if(a.y - b.y > 1e-10){
        return false;
    }
}

int main()
{
    int n;
    scanf("%d", &n);
    while (n--){
        vector<input> in;
        int k;
        scanf("%d", &k);
        while (k--){
            input temp;
            scanf("%s", temp.coord);
            sscanf(temp.coord, "(%lf,%lf)", &temp.x, &temp.y);
            in.push_back(temp);
        }
        sort(in.begin(), in.end(), compare);
        int i = in.size() - 1;
        while ( i > 0){
            if (in[i].y == in[i-1].y){
                i--;
            }else{
                break;
            }
        }
        printf("%s %s\n", in[i].coord, in.front().coord);
    }
    return 0;
}
 

 Day1 就这四道题,明天会继续。

posted @ 2012-01-18 21:44  dontpanic  阅读(207)  评论(0编辑  收藏  举报