A. 得分计算1

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

OJ通常支持两种记分模式,其中一种为OI模式。该模式下,每题的得分由每个测试用例的分数决定。也就是说在这种模式下,每个测试用例都有一个分值,用户每过一个测试用例就得到相应的值。请你写一段程序来计算某一题在此模式下的得分。

输入:
第一行为一个整数n,代表测试用例组数,后边n行,每行均为两个用空格分隔的整数r和s,代表一组测试用例情况。其中s代表该组测试用例的分值,r代表结果。如果r为0,则代表该组测试用例没通过,为1则代表该组测试用例通过。

输出:只有一行,为该题的最终得分。

输入样例

3
1 50
0 100
1 100

输出样例

150

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int n;
	scanf("%d", &n);
	int i;
	int point = 0; //初始化分数为0 
	for (i = 0; i < n; i++)
	{
		int r, s;
		scanf("%d %d", &r, &s); //输入r,s 
		if (r)
		{
			point = point + s; //计算分数 
		}
	}
	printf("%d", point);
	return 0;
}

B. 罚时计算1

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

OJ通常支持两种记分模式,其中一种为ICPC模式。该模式下,每个通过的题目都有一个罚时,罚时的计算涉及到两个参数,一个是提交的时间,一个提交的次数。一个通过了的题目最终的罚时为: 提交的时间(指从比赛开始到该题通过的时间,以分钟为单位)加上 错误提交的次数乘以20 (也就是说每多提交一次,罚时增加20分钟)。未通过的题目计算罚时为:错误提交的次数乘以20。请你写一段程序来计算某次考试某同学的总罚时。

输入:
若干行,每行均为三个用空格分隔的整数n,t和r,代表一次提交的情况。其中n代表题号,t代表该题的提交时间。r代表结果。如果r为0,则代表该次提交没通过,为1则代表该次提交通过。如果n,t和r同时为0代表输入结束。(注:输入的顺序即为该同学的提交顺序,一个题目提交通过后,系统不会再记录该题目新的提交)

输出:
只有一行,为该同学的总罚时。

输入样例

1 10 1
2 25 1
3 40 0
3 65 0
0 0 0

输出样例

75

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int n, t, r;
	scanf("%d %d %d", &n, &t, &r); //输入n,t,r 
	int point = 0;
	while (n != 0 || t != 0 || r != 0) //判断是否结束 
	{
		if (r) //通过 
		{
			point = point + t;
		}
		else //不通过 
		{
			point += 20;
		}
		scanf("%d %d %d", &n, &t, &r);
	}
	printf("%d", point); //输出 
	return 0;
}

C. 卫星图片1

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

一张卫星照片可看作是由多个小方格组合而成的矩阵,每个小方格叫做一个像素点。每个像素点对应一个灰度值(整数)。某张卫星照片中如果某个像素点的值比它周边所有的像素点的值(最多有8个,最少有3个)都大50或50以上,我们就认为该点为敌人的据点。现给定一张照片,请你写一段程序找出照片中所有的据点。

输入:
照片虽然是个二维矩阵,但在磁盘上,为了算法的方便通常以“一维”的形式存储在文件中。所以输入包括两行,第一行为2个整数m, n(2<=m, n<=100),分别代表像素矩阵的行数和列数。后边是一个m X n的矩阵,代表各个像素点的灰度值。

输出:
据点的个数。

输入样例

3 3
100 100 100 150 100 100 100 100 150

输出样例

2

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cul(int m, int n);

int main()
{
	int m, n;
	scanf("%d %d", &m, &n); //输入地图大小 
	printf("%d", cul(m, n));
	return 0;
}

int cul(int m, int n)
{
	
	int map[100][100];
	int i, j;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &map[i][j]);  //输入地图 
		}
	}
	int a, b;
	int num = 0;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++) //对地图每一个点遍历 
		{
			int flag = 1;
			for (a = -1; a <= 1 && flag == 1; a++)
			{
				for (b = -1; b <= 1 && flag == 1; b++) //对前后左右遍历 
				{
					if (i + a >= 0 && i + a < m && j + b >= 0 && j + b <n && !(a == 0 && b == 0))
					{
						if (map[i][j] < map[i + a][j + b] + 50)  //判断据点 
						{
							flag = 0;
						}
					}
				}
			}
			if (flag)
			{
				num++;
			}
		}
	}
	return num; //返回值 
}

D. 电商1

运行时间限制: 1000运行内存限制: 4096
作者: scshuanghai是否specialjudge: False

题目描述

某电商网站产品的验证码由字母和数字组成。现在需要按照验证码的数字组合进行排序,请你写一段依据此规则的排序程序。

验证码解释:
Abc12De3的数字组合为123
4f5xy6B的数字组合为456
Th99eKing的数字组合为99

以上三个验证码,如果按照数字组合降序排列为:
4f5xy6B
Abc12De3
Th99eAing

输入:第一行为一个正整数n(0<n<10000)。后边是n行,每行一个字符串,代表产品验证码,每个字符串中仅包含字母和数字,且长度小于1000。
注:假定所有验证码的数字组合不存在重复情况。

输出:
共n行,每行为一个字符串,为排序后的验证码(按照数字组合降序排列)。

注意:此题内存有限制!

输入样例

3
Abc12De3
4f5xy6B
Th99eKing

输出样例

4f5xy6B
Abc12De3
Th99eAing

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sort(int n);

int main()
{
	int n;
	scanf("%d", &n); //输入个数 
	sort(n);
	return 0;
}

void sort(int n)
{
	char **codes = (char**)malloc(sizeof(char*) * n); //创建一个指针数组 
	int *num = (int*)malloc(sizeof(int) * n); //用于储存数字组合 
	int i, j;
	for (i = 0; i < n; i++)
	{
		codes[i] = (char*)malloc(sizeof(char) * 1010); //创建一个字符串 
		scanf("%s", codes[i]);
		num[i] = 0;
		for (j = 0; codes[i][j] != '\0'; j++)
		{
			if (codes[i][j] >= '0' && codes[i][j] <= '9')
			{
				num[i] = num[i] * 10;
				num[i] = num[i] + codes[i][j] - '0'; //计算数字组合 
			}
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n - i - 1; j++) //排序 
		{
			if (num[j] < num[j + 1])
			{
				int tmp;
				char temp[1010];
				tmp = num[j];
				num[j] = num[j + 1];
				num[j + 1] = tmp;
				strcpy(temp, codes[j]);
				strcpy(codes[j], codes[j + 1]);
				strcpy(codes[j + 1], temp);
			}
		}
	}
	for (i = 0; i < n; i++) //输出排序后 
	{
		puts(codes[i]);
	}
	return 0;
}

E. 活跃用户统计

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

某网站当天日志文件由5个字段组成,以空格分隔,格式为:“时 分 秒 用户名 操作”,其中“时分秒”均为整数,“用户名”为小写字符串,“操作”为“LOGIN”和”LOGOUT”两个大写字符串。举例如下:

11 23 59 tom LOGIN
12 24 39 tom LOGOUT

请统计当天用户登录次数排名(从大到小)。

输入:第一行为一个整数n,代表记录总数,后边n行,每行均符合以上日志记录格式。

输出:按用户登录次数“从大到小”排名的记录,共m行,每行格式为 “用户名 登录次数 最后一次登录时间(时 分 秒)”。如果两个用户登录次数一样,则用户名字符串小的排前面。

输入样例

8
8 10 11 tom LOGIN
9 11 23 jerry LOGIN
10 10 38 tom LOGOUT
12 10 14 micky LOGIN
13 2 15 micky LOGOUT
14 0 1 jerry LOGOUT
20 24 39 tom LOGIN
22 33 15 tom LOGOUT

输出样例

tom 2 20 24 39
jerry 1 9 11 23
micky 1 12 10 14

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void count(int n);

struct users //定义结构体 
{
	int times;
	int hour;
	int min;
	int second;
	char name[50];
};

int main()
{
	int n;
	scanf("%d", &n); //输入日志数量 
	count(n); //计算 
	return 0;
}

void count(int n)
{
	char **names = (char**)malloc(sizeof(char*) * n); //名字数组 
	struct users *user = (struct users*)malloc(sizeof(struct users) * n);  //结构体数组 
	int i, j, used = 0;
	for (i = 0; i < n; i++)
	{
		names[i] = (char*)malloc(sizeof(char) * 50); //名字 
	}
	int h, m, s;
	char name[50], state[10];
	for (i = 0; i < n; i++)
	{
		scanf("%d %d %d %s %s", &h, &m, &s, name, state); //输入日志 
		if (strcmp(state, "LOGIN") == 0)
		{
			int existed = 0, place;
			for (j = 0; j < n; j++) //是否有用户名 
			{
				if (strcmp(names[j], name) == 0)
				{
					existed = 1;
					place = j;
				}
			}
			if (existed) //有 
			{
				user[place].times = user[place].times + 1;
				user[place].hour = h;
				user[place].min = m;
				user[place].second = s;
			}
			else //无 
			{
				user[used].times = 1;
				user[used].hour = h;
				user[used].min = m;
				user[used].second = s;
				strcpy(user[used].name, name);
				strcpy(names[used], name);
				used++;
			}
		}
	}
	for (i = 0; i < used; i++)
	{
		for (j = 0; j < used - i - 1; j++) //名字排序 
		{
			if (strcmp(user[j].name, user[j + 1].name) > 0)
			{
				struct users tmp;
				tmp = user[j];
				user[j] = user[j + 1];
				user[j + 1] = tmp;
			}
		}
	}
	for (i = 0; i < used; i++)
	{
		for (j = 0; j < used - i - 1; j++) //登陆次数排序 
		{
			if (user[j].times < user[j + 1].times)
			{
				struct users tmp;
				tmp = user[j];
				user[j] = user[j + 1];
				user[j + 1] = tmp;
			}
		}
	}
	for (i = 0; i < used; i++) //输出 
	{
		printf("%s %d %d %d %d\n", user[i].name, user[i].times, user[i].hour, user[i].min, user[i].second);
	}
}
分类: OJ代码