HDU2021-2030题解

文章目录

      • (贪心) 2021 发工资咯:)
      • 2022 海选女主角
      • 2023 求平均成绩
      • 2024 C语言合法标识符
      • 2025 查找最大元素
      • 2026 首字母变大写
      • 2027 统计元音
      • 2028 Lowest Common Multiple Plus
      • 2029 Palindromes _easy version
      • (汉字编码) 2030 汉字统计

(贪心) 2021 发工资咯:)

  • Problem Description
    作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵。但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
    这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
  • Input
    输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。n=0表示输入的结束,不做处理。
  • Output
    对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。
  • Sample Input
    3
    1 2 3
    0
    
  • Sample Output
    4
    

使每个老师的工资对应的人民币张数最少,则总共最少。

#include 
int main() {
	int n;
	while (~scanf("%d", &n) && n) {
		int ans = 0, t; 
		for (int i = 0; i < n; i++) {
			scanf("%d", &t);
			while (t) { //对每个老师的工资使用贪婪思想 
				if (t >= 100) t -= 100;
				else if (t >= 50) t -= 50;
				else if (t >= 10) t -= 10;
				else if (t >= 5) t -= 5;
				else if (t >= 2) t -= 2;
				else t -= 1;
				ans++;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

2022 海选女主角

#include 
#include 
using namespace std;
int main() {
	int m, n;
	while (~scanf("%d%d", &m, &n)) {
        int t, col, row, Max = 0;
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				scanf("%d", &t);
				if (abs(t) > abs(Max)) { //选择所有数中绝对值最大的数
					Max = t;
					row = i + 1, col = j + 1;
				}
			}
		}
		printf("%d %d %d\n", row, col, Max);
	}
	return 0;
}

2023 求平均成绩

仔细读题,每个测试实例后面跟一个空行。另外,以后我永远不会随意比较浮点数和整数的大小,必须进行显式转换(虽然与题目无关…而且,abcd命名法危害很大,一个不注意就搞混乱了,如果不写注释千万少用abcd命名法。

#include 
int main() {
	int n, m;
	while (~scanf("%d%d", &n, &m)) {
		int a[55][6];
		double cavg[6];
		for (int i = 0; i < n; i++) {
			double sum = 0;
			for (int j = 0; j < m; j++) {
				scanf("%d", &a[i][j]);
				sum += a[i][j];
			} //学生各科的平均成绩 
			printf("%s%.2lf", i != 0 ? " " : "", sum / m);
			if (i == n - 1) printf("\n");
		} 
		for (int i = 0; i < m; i++) {
			double csum = 0; //各科学生的平均成绩 
			for (int j = 0; j < n; j++) 
				csum += a[j][i];
			cavg[i] = csum / n;			
			printf("%s%.2lf", i != 0 ? " " : "", cavg[i]); 
			if (i == m - 1) printf("\n");
		}
		int ans = 0; //各科成绩均大于等于平均成绩的学生数量
		for (int i = 0; i < n; i++) {
			int flag = 0;
			for (int j = 0; j < m; j++) {
				if (1.0 * a[i][j] < cavg[j]) { //有一科成绩小于该科平均成绩就break 
					flag = 1;
					break;
				}
			} 
			if (!flag) ans++;
		}
		printf("%d\n\n", ans);
	}
	return 0;
}

2024 C语言合法标识符

#include  
#include 
#include 
using namespace std;
int main() {
	int n;
	string s; 
	scanf("%d\n", &n);
	while (n--) {
		getline(cin, s);
		if (s[0] >= '0' && s[0] <= '9') {
			printf("no\n"); 
			continue;
		}
		int flag = 0;
		for (int i = 0; i < s.size(); i++) {
			if (!isalnum(s[i]) && s[i] != '_') {
				flag = 1; break;
			}
		}
		if (flag) printf("no\n");
		else printf("yes\n");
	} 
	return 0;
}

2025 查找最大元素

根本不用实际插入(逃

#include 
#include 
#include 
using namespace std;
int main() {
	string s;
	while (cin >> s) {
		char m = s[0];
		for (int i = 0; i < s.size(); i++) 
			if (s[i] > m) m = s[i];
		for (int i = 0; i < s.size(); i++) {
			printf("%c", s[i]);
			if (s[i] == m) printf("(max)");
		}
		printf("\n");
	}
	return 0;
}

2026 首字母变大写

#include 
#include 
#include 
using namespace std;
int main() {
	string s;
	while (getline(cin, s)) {
		for (int i = 0; i < s.size(); i++) { //每个单词前都有一个空格,第一个字母单独处理
			if (i == 0 || (s[i - 1] == ' ' && isalpha(s[i]))) 
            	printf("%c", toupper(s[i]));
			else printf("%c", s[i]); 
		}
		printf("\n");
	}
	return 0;
} 

2027 统计元音

随便写的代码。其实完全可以直接用130大小的哈希表映射元音字母,记录元音字母的次数,非元音字母次数均为0。

#include  
#include 
#include 
using namespace std;
int change(char c) {
	switch (c) {
		case 'a': return 0;
		case 'e': return 1;
		case 'i': return 2;
		case 'o': return 3;
		case 'u': return 4;
		default: return 5;
	}
}
void print(char c, int a[]) {
	printf("%c:%d\n", c, a[change(c)]);
}
int main() {
	int n, r;
	scanf("%d\n", &n);
	string s;
	while (n--) {
		int a[5] = {0};
		getline(cin, s);
		for (int i = 0; i < s.size(); i++) {
			r = change(s[i]);
			if (r >= 0 && r <= 4) a[r]++; 
        }
 		print('a', a); print('e', a); print('i', a); print('o', a); print('u', a);
		if (n != 0) printf("\n");
	}
	return 0;
}

2028 Lowest Common Multiple Plus

求n个数的最小公倍数,其实就是第一个两个数求lcm,然后它们的lcm和后面的数依次求lcm。

#include 
int gcd(int a, int b) {
	return !b ? a : gcd(b, a % b);
}
int lcm(int a, int b) {
	return a / gcd(a, b) * b;
}
int main() {
	int n, t;
	while (~scanf("%d", &n)) {
		int ans = 1;
		for (int i = 0; i < n; i++) {
			scanf("%d", &t);
			ans = lcm(ans, t);
		}
		printf("%d\n", ans);
	}
	return 0;
}

2029 Palindromes _easy version

#include 
#include 
#include 
using namespace std;
int main() {
	int n;
	cin >> n; getchar();
	string s, rev;
	while (n--) {
		getline(cin, s);
		rev = s;
		reverse(rev.begin(), rev.end());
		if (rev == s) printf("yes\n"); //利用string特性
		else printf("no\n");
	}
	return 0;
}

(汉字编码) 2030 汉字统计

这个题要求统计字符串中汉字的个数,像我们平时的ascii码都是0-127,一个字节,我们用%c输出的时候都是一个字节一个字节输出的。而汉字机内码占两个字节,且汉字的编码不论是高位字节还是低位字节都小于0。因此统计小于0的字节/符数目,除以2就好了。

#include 
#include 
using namespace std;
int main() {
	int n;
	scanf("%d\n", &n);
	string s;
	while (n--) {
		getline(cin, s);
		int ans = 0;
		for (int i = 0; i < s.size(); i++) 
			if (s[i] < 0) ans++;
		printf("%d\n", ans / 2);
	}
	return 0;
}

你可能感兴趣的:(HDU)