今天是第一天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 就这四道题,明天会继续。