HDU 2000-2099水题记录帖

2000ASCII码排序

第一遍自己写了冒泡排序,第二遍调用algorithm中的sort(s,s+n)函数。

#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 3+5
int main()
{
	char s[maxn];
	while (scanf("%s",s)!=EOF)
	{
		sort(s,s+3);
		printf("%c %c %c\n", s[0], s[1], s[2]);
	}
	
	return 0;
}

2001 计算两点间的距离

直接sqrt(两个点平方的和就好)

#include<iostream>
#include<algorithm>
#define maxn 4+4
using namespace std;
int main()
{
	double s[maxn];
	while (scanf("%lf%lf%lf%lf", &s[0],&s[1],&s[2],&s[3]) == 4)
	{

		double ans = (s[0] - s[2])*(s[0] - s[2]) + (s[1] - s[3])*(s[1] - s[3]);
		printf("%.2f", sqrt(ans));
		printf("\n");
	}
	
	return 0;
}

2002 计算球的体积

球的体积公式是4*1.0/3*pi*r^3,注意的是先define pi,且4/3=1

#include<iostream>
#include<algorithm>
#define PI 3.1415927
using namespace std;
int main()
{
	double r;
	while (scanf("%lf",&r)!=EOF)
	{
		double ans = 4*1.0/3*PI*r*r*r;
		printf("%.3f\n",ans);
	}
	return 0;
}

2003 求绝对值 内心mmp,紫书上还有个题WA搞不清楚,算了,先做这个吧。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	double a;
	while (scanf("%lf", &a) != EOF)
	{
		printf("%.2f", abs(a));
		printf("\n");
	}
	return 0;
}

2004 成绩转换

原来写这个题目的时候是用switch判断,现在看了一点紫书,采用的是用字符串数组来保存"ABCED",

相对来说比前面的题有趣了一点。

#include<iostream>
#include<algorithm>
using namespace std;
char des[11] = { 'E','E','E','E','E','E','D','C','B','A','A' };
int main()
{
	int a;
	while (scanf("%d", &a)!=EOF)
	{
		if (a > 100 || a < 0)
		{
			printf("Score is error!\n");
		}
		else {
			a /= 10;
			printf("%c\n", des[a]);
		}
	}

	return 0;
}

2005 第几天?

闰年是被4整除且不被100整除,或者被400整除的年份。输入月份天数WRONG了一次,忘记输入!=EOF,TLE了一次。

#include<iostream>
#include<algorithm>
#define month 12+3
int mothday[month] = {31,-1,31,30,31,30,31,31,30,31,30,31};
bool is_pin(int y);
using namespace std;
int main()
{
	int y, m, d;
	while (scanf("%d/%d/%d", &y, &m, &d)!=EOF)
	{
		if (is_pin(y))
		{
			mothday[1] = 28;
		}
		else {
			mothday[1] = 29;
		}
		//cout << y << "," << m << "," << d << endl;
		int days = d;
		for (int i = 0; i < m - 1; i++)
		{
			days += mothday[i];
		}
		printf("%d\n", days);
	}

	return 0;
}

bool is_pin(int y)
{
	bool result;
	if ((y % 4 == 0&& y % 100 != 0)|| y % 400 == 0)
	{
		result = false;
	}
	else 
		result= true;
	return result;
}

2006 求奇数的乘积

先读入每一行有几个数,然后判断这个数是否是奇数,如果是奇数,那么相乘,最终输出结果。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int T = 0;
	while (scanf("%d", &T) != EOF)
	{
		int s = 1;
		int a;
		while(T--)
		{
			scanf("%d", &a);
			if (a % 2 == 1) {
				s *= a;
			}
		}
		printf("%d\n", s);
	}

	return 0;
}

2007 平方和与立方和

本题的思路较为简单,输入是给定一段连续的整数,代表m与n的大小是不确定的,没有比较m、n的大小导致了WA。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int m, n;
	while (scanf("%d%d", &m, &n) != EOF)
	{
		int temp;
		if (m > n)
		{
			temp = n;
			n = m;
			m = temp;
		}
		int x=0, y=0;
		for (int i = m; i <= n; i++)
		{
			if (i % 2 == 0)x += i*i;
			else y += i*i*i;
		}
		printf("%d %d\n", x, y);
	}

	return 0;
}

2008 数值统计

输入时直接统计即可。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int T;
	while (scanf("%d", &T) == 1 && T != 0)
	{
		double a;
		int b=0,c=0,d=0;
		while (T--)
		{
			scanf("%lf", &a);
			if (a < 0) b++;
			else if (a == 0)c++;
			else d++;
		}
		printf("%d %d %d\n",b,c,d);
	}

	return 0;
}

2009 求数列的和

Hint:对整数N取平方根后是一个浮点数,不可以强制转换成整数,需要新定义个浮点数用于计算。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n, m;
	while (scanf("%d%d", &n, &m) != EOF)
	{
		double sum = 0;
		double nn = n;
		for (int i = 0; i < m; i++)
		{
			sum += nn;
			nn = sqrt(nn);
			//printf("%.2f,%.2f\n", sum,nn);
		}

		printf("%.2f\n", sum);
	}

	return 0;
}

2010 水仙花数

本题用了2种办法做,如下,需要注意输入输出格式

#include<iostream>
#include<algorithm>
#define maxn 100
int sq[maxn];
using namespace std;

int main()
{
	//解法一
	//int m, n;
	//while (scanf("%d%d",&m,&n)!=EOF)
	//{
	//	int first=1,yes=0;

	//	for (int i = m,ii=i; i <= n; i++,ii=i)
	//	{
	//		int sum = 0, sumi = 0;
	//		int temp;
	//		while (ii)
	//		{
	//			temp = ii % 10;
	//			sumi = pow(temp, 3);
	//			sum += sumi;
	//			ii /= 10;
	//		//	printf("%d %d %d\n",temp,ii,sum);
	//		}
	//		if (i == sum)
	//		{
	//			if (first)
	//			{
	//				printf("%d", i);
	//				first = 0;
	//			}
	//			else {
	//				printf(" %d", i);
	//			}
	//			yes = 1;
	//		}
	//	}
	//	if (!yes) {
	//		printf("no");
	//	}
	//	printf("\n");
	//}

	//解法二
	int s, t = 0;
	for (int i = 1; i <= 9; i++)
	{
		for (int j = 0; j <= 9; j++)
		{
			for (int k = 0; k <= 9; k++)
			{
				s = pow(i, 3) + pow(j, 3) + pow(k, 3);
				if (s == i * 100 + j * 10 + k)
				{
					//printf("%d ", s);
					sq[t++] = s;
				}
			}
		}
		//if (s > 999)break;
	}
	int m, n;
	while (scanf("%d%d", &m, &n) != EOF)
	{
		int first = 1, yes = 0;
		for (int i = 0; i < t; i++)
		{
			if (sq[i] >= m&&sq[i] <= n)
			{
				if (first)
				{
					printf("%d", sq[i]);
					first = 0;
				}
				else {
					printf(" %d", sq[i]);
				}
				yes = 1;
			}
		}

		if (!yes) {
			printf("no");
		}
			printf("\n");
	}

	return 0;
}

2011 多项式求和

按照题目意思解就可以了

#include<iostream>
#include<algorithm>
using namespace std;
double f(int i);
int main()
{
	int m;
	scanf("%d", &m);
	while (m--)
	{
		int n;
		scanf("%d", &n);
		double sum=0;
		int t=1;
		for (int i = 1; i <= n; i++)
		{
			sum+=t*f(i);
			t = -1*t;
			//printf("%d\n", t);
		}
		printf("%.2f\n", sum);
	}

	return 0;
}
double f(int i)
{
	return 1.0 / i;
}

2012 素数判定

自己取变量名字不要太随便,容易忘记。还有就是提交的时候要把测试输出注释掉

#include<iostream>
#include<algorithm>
using namespace std;
bool is_su(int x);
int main()
{
	int x, y;
	while (scanf("%d%d", &x, &y) != EOF&&x!=0||y!=0)
	{
		int h=1;
		int f;
		for(int i = x; i <= y; i++)
		{
			f = pow(i, 2) + i + 41;
			//printf("%d ", f);
			if (!is_su(f)) {
				h = 0; 
				break;
			}
		}
		//printf("\n");
		if (h == 0) printf("Sorry\n");
		else printf("OK\n");
	}

	return 0;
}
bool is_su(int x)
{
	int i;
	if (x == 1)return false;
	for ( i = 2; i < x; i++)
	{
		if (x%i == 0)
			return false;
	}
	if(i ==x)
	return true;
}

2013 蟠桃记

这个题反向求就可以了,+1之后再乘以2,注意循环次数要-1.

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		int sum=1;
		n--;
		while (n--)
		{
			sum = (sum + 1) * 2;
		}
		printf("%d\n", sum);
	}

	return 0;
}

2014 青年歌手大赛

在读入每一个分数的时候,记录最大值和最小值,并且求分数的和,最后再用总分减去最大值和最小值除以分数和减二

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		int nn = n;
		int sum = 0;
		int s;
		scanf("%d", &s);
		sum += s;
		n--;
		int max=s;
		int min=s;
		while (n--)
		{
			scanf("%d", &s);
			if (s < min) min = s;
			if (s > max)max = s;
			sum += s;
		}
		printf("%.2f\n", (sum - max - min)*1.0 / (nn-2));
	}

	return 0;
}

2015 偶数求和

本题需要注意输出格式,思路就是,记录每一个位置的数,并且用sum加上和,记录有几个数相加,如果记录的个数等于m,那么输出这个数,循环结束以后,判断k是否存在且小于m,输出。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n,m;
	while (scanf("%d%d", &n, &m) != EOF)
	{
		int k = 0;
		int a = 0;
		int sum = 0;
		int i = 0;
		int first=1;
		for ( i = 0; i < n; i++)
		{
			a += 2;
			sum += a;
			k++;
			if (k == m) {
				if (first) {
					printf("%d", sum / m);
					first = !first;
				}
				else {
					printf(" %d", sum / m);
				}
				k = 0;
				sum = 0;
			}
		}
		if (i == n && k<m &&k) {
			if (first)
				printf("%d", sum / k);
			else
				printf(" %d", sum / k);
		}

		printf("\n");
	}
	

	return 0;
}

2016 数据的交换输出

采用最常规的方法直接写的。

#include<iostream>
#include<algorithm>
#define maxn 100+10
int s[maxn];
using namespace std;
int main()
{
	int n;
	while (scanf("%d", &n)== 1&&n!=0)
	{
		int i = 0,nn=n;
		scanf("%d", &s[i++]);
		nn--;
		int min = s[0];
		int minx = 0;
		while (nn--)
		{
			scanf("%d", &s[i]);
			if (min > s[i])
			{
				min = s[i];
				minx = i;
			}
			i++;
		}
		int temp = s[0];
		s[0] = s[minx];
		s[minx] = temp;
		for (int i = 0; i < n; i++)
		{
			if (i == n - 1) printf("%d", s[i]);
			else {
				printf("%d ", s[i]);
			}
		}
		printf("\n");
	}

	return 0;
}

2017 字符串统计

读入每一个字符串,判断是否为digit(0-9)的数字,如果是,则num++。不清楚被人200kb的内存是怎么跑出来的,我的是1700kb

#include<iostream>
#include<algorithm>
#define maxn 1000
using namespace std;
int main()
{
	int T;
	scanf("%d", &T);
	getchar();
	char a;
	int num = 0;
	while (T--)
	{
		while (scanf("%c",&a)&&a!='\n')
		{
			if (isdigit(a)) num++;
		}
		printf("%d\n", num);
		num = 0;
	}

	return 0;
}

2018 母牛的故事

这个题是个数学问题。

我用的方法是记录小母牛1岁的个数、小母牛2岁的个数、小母牛3岁的个数、小母牛大于等于4岁的个数。

先写个几年这些母牛的个数,就可以找到规律。

方法一:统计每一年份的各个年龄段牛的数量

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	while (scanf("%d", &n) != EOF&&n!=0)
	{
		int cow1, cow2, cow3, cow4;//分别表示牛的年龄,只记做1,2,3,4
		cow1 = cow2 = cow3 = 0;
		cow4 = 1;
		for (int i = 0; i < n-1; i++)
		{
			cow4 = cow4 + cow3;
			cow3 = cow2;
			cow2 = cow1;
			cow1 = cow4;
			//printf("%d %d %d %d\n", cow4, cow1, cow2, cow3);
		}
		int cow = cow1 + cow2 + cow3 + cow4;
		printf("%d\n", cow);
	}

	return 0;
}

方法二:直接计算牛的总数

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	while (scanf("%d", &n) != EOF&&n!=0)
	{
		int a = 1, b = 2, c = 3,temp;
		if (n > 0 && n < 4)printf("%d\n", n);
		else {
			for (int i = 0; i < n-3; i++)
			{
				temp = b;
				b = c;
				c = a + c;
				a = temp; 
			}
			printf("%d\n", c);
		}
	}

	return 0;
}

方法三:表达式法和求斐波那契额数列类似,本题是F(1) = 1,F(2) =2,F(3) = 3,求F(n) = F(n-1)+F(n-3),线代有点忘记了,且数学渣渣不知道如何去推,日后若有机会写出来,再补上。

2019 数列有序

如果那个m大于输入的数字,则继续循环;否则保存到数组以后跳出循环,来一个输出一个。

#include<iostream>
#include<algorithm>
#define maxn 100+10
using namespace std;
int main()
{
	int n, m;
	int s[maxn];
	while (scanf("%d%d", &n, &m) == 2)
	{
		getchar();
		if (n == 0 && m == 0)break;
		int i;
		for (i = 0; i < n + 1; i++)
		{
			scanf("%d", &s[i]);
			if (m >= s[i]) continue;
			else {
				s[i + 1] = s[i];
				s[i] = m;
				i += 2;
				break;
			}
		}
		//printf("%d", i);
		for (int j = 0; j < i; j++)
		{
			if (j == i - 1)printf("%d", s[j]);
			else printf("%d ", s[j]);
		}
		int a;
		for (; i < n + 1; i++)
		{
			scanf("%d", &a);
			printf(" %d", a);
		}
		printf("\n");

	}
	return 0;
}

2020 绝对值排序

使用sort函数,摆脱选择排序和冒泡排序的低效率

#include<iostream>
#include<algorithm>
#define maxn 100+10
bool compare(int a, int b);
using namespace std;
int main()
{
	int n;
	int s[maxn];
	while (scanf("%d", &n)==1)
	{
		if (n == 0)break;
		for (int i = 0; i < n; i++)
		{
			scanf("%d",&s[i]);
		}
		sort(s, s + n,compare);
		for (int i = 0; i < n; i++)
		{
			if(i!=n-1)
				printf("%d ", s[i]);
			else printf("%d", s[i]);
		}
		printf("\n");
		getchar();
	}
}

bool compare(int a,int b)
{
	return abs(a) > abs(b);
}

2021 发工资

计算每一个老师的工资最少几张钞票,思路:贪心法。

采用/和%可以降低时间复杂度。

#include<iostream>
#include<algorithm>
using namespace std;
int s[6] = { 100,50,10,5,2,1 };
int solve(int n);
int main()
{
	int n,a,ni;
	while (scanf("%d", &n) == 1)
	{
		int sum = 0;
		getchar();
		if (n == 0)break;
		while (n--)
		{
			scanf("%d", &a); 
			 ni=solve(a);
			 sum += ni;
		}
		printf("%d\n",sum);
	}

	return 0;

}
int solve(int a)
{
	int n = 0;
	for (int i = 0; i < 6; i++)
	{
		/*while (a - s[i] >= 0)
		{
			a -= s[i];
			n++;
			if (a == 0)return n;
		}*/
		n += a / s[i];
		a = a%s[i];
		if (a == 0) return n;
	}
}

2022 海选女主角

遍历且记录,注意全部为0的时候。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int m, n;
	while (scanf("%d%d", &m, &n)!=EOF)
	{
		getchar();
		int a;
		int aMax = 0;
		int mx = 1, ny = 1;
		for (int i = 0; i < m; i++)
		{
			for (int j = 0; j < n; j++)
			{
				scanf("%d", &a);
				if (abs(a) > abs(aMax)) {
					aMax = a;
					mx = i + 1;
					ny = j + 1;
				}
			}
			getchar();
		}
		printf("%d %d %d\n", mx, ny, aMax);

	}

	return 0;
}

2023求平均成绩

按照要求写循环求出即可,注意输出格式

#include<iostream>
#include<algorithm>
#define maxn 50+5
#define maxm 5+5
int s[maxn][maxm];
double ave_student[maxn];
double ave_class[maxm];
using namespace std;
int main()
{
	int n,m;
	int first = 1;
	while (scanf("%d%d", &n, &m) != EOF)
	{
		
		int sum = 0;
		getchar();
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				scanf("%d", &s[i][j]);
				sum += s[i][j];
			}
			ave_student[i] = sum*1.0 / m;
			//printf("%.2f\n", sum*1.0/n);
			sum = 0;
		}

		for (int i = 0; i < m; i++)
		{
			for (int j = 0; j < n; j++)
			{
				sum += s[j][i];
			}
			ave_class[i] = sum*1.0 / n;
			//printf("%.2f\n", sum*1.0 / m);
			sum = 0;
		}

		int num = n;
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				if (s[i][j] < ave_class[j])
				{
					num--;
					break;
				}
			}
		//	printf("%d", num);
		}
		
		for (int i = 0; i < n; i++) {
			if(i!=n-1)
				printf("%.2f ", ave_student[i]);
			else printf("%.2f\n", ave_student[i]);
		}
		for (int i = 0; i < m; i++)
		{
			if (i != m - 1)
				printf("%.2f ", ave_class[i]);
			else printf("%.2f\n", ave_class[i]);
		}
		printf("%d\n", num);
		printf("\n");
	}
	return 0;
}

2024 C语言合法标识符

首先又回顾了什么是C语言合法标识符,即:只能由_、字母、数字组成的字符串,且首位只能为_或者字母。

#include<iostream>
#include<algorithm>
int first = 1;
bool solve(char c);
using namespace std;
int main()
{
	int T;
	scanf("%d", &T);
	getchar();
	char c;
	while(T--)
	{ 
		bool result =true;
		while ((c = getchar())!=EOF&&c!='\n') {
			if (!solve(c)) result = false; 
		}
		if(result)
			printf("yes\n");
		else 
			printf("no\n");

		first = 1;
	}

	return 0;
}
bool solve(char c)
{
	if (first == 1)
	{
		first = 0;
		if (c == '_'||isalpha(c))
			return true;
		else
			return false;
	}
	else {
		if (c == '_'||isalpha(c)||isdigit(c))return true;
		 else return false;
	}
}

2025 查找最大元素

记录字母,然后输出即可。利用c-‘A’来比较位置

#include<iostream>
#include<algorithm>
#define maxn 100+10
char s[maxn];
using namespace std;
int main()
{
	while (scanf("%s", s) != EOF)
	{   
		int len = strlen(s);
		char c = 'A';
		int temp_len;
		for (int i = 0; i < len; i++)
		{
			temp_len = s[i] - 'A';
			if (temp_len > c - 'A') {
				c = s[i];
			}
		}
		//printf("%c\n", c);
		for (int i = 0; i < len; i++)
		{
			if (s[i] != c)
				printf("%c", s[i]);
			else
				printf("%c(max)", s[i]);
		}
		printf("\n");
	}
	return 0;
}

2026 首字母变大写

观察规律,来解题,判断那个字母是否为首字母

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	char c;
	int yes=1;
	while ((c = getchar()) != EOF)
	{
		if (c == '\n') { 
			printf("\n");
			yes = 1;
			continue;
		}
		if (isalpha(c))
		{
			if (yes) { printf("%c", toupper(c)); yes = 0; }
			else printf("%c",c);
		}else{
			yes = 1;
			printf("%c", c);
		}
	}

	return 0;
}

2027统计元音

这个直接统计即可。

#include<iostream>
#include<algorithm>
#define maxn 128
int s[maxn];
char ans[5] = {'a','e','i','o','u'};
void sovle(char c);
void output();
using namespace std;
int main()
{
	int n;
	scanf("%d", &n);
	getchar();
	char c;
	int first = 1;
	while (n--)
	{
		while ((c = getchar()) != EOF&&c != '\n') {
			sovle(c);
		}
		if (first){
			output();
			first = 0;
		}
		else {
			printf("\n");
			output();
		}
	}
	
	return 0;
}

void sovle(char c)
{
	s[c]++;
}

void output()
{
	for (int i = 0; i < 5; i++)
	{
		printf("%c:%d\n", ans[i], s[ans[i]]);
	}
	s['a'] = 0;
	s['e'] = 0;
	s['i'] = 0;
	s['o'] = 0;
	s['u'] = 0;
}

2028 求最小公倍数

回顾了两个数的最小公倍数是两个数的乘积除以两个数的最大公约数,且两个数的最大公约数的算法:辗转相处法。

#include<iostream>
#include<algorithm>
int gcd(int a, int b);
using namespace std;
int main()
{
	int n;
	while (scanf("%d", &n)!=EOF)
	{
		int a,b,temp;
		scanf("%d", &a);
		n--;
		while (n--)
		{
			scanf("%d", &b);
			if (a < b) {
				temp = a;
				a = b;
				b = temp;
			}
			a=a/gcd(a, b)*b;
		}
		printf("%d\n", a);
	}

	return 0;
}
int gcd(int a, int b)
{
	int temp;
	while (a%b != 0)
	{
		temp = b;
		b = a%b;
		a = temp;
		
	}
	return b;
}

2029 回文串

按照要求写即可。

#include<iostream>
#include<algorithm>
#define maxn 1000000000
char s[maxn];
using namespace std;
int main()
{
	int n,len;
	scanf("%d", &n);
	getchar();
	while (n--)
	{
		int yes = 1;
		scanf("%s", s);
		len = strlen(s);
		for (int i = 0; i < len / 2; i++)
		{
			if (s[i] != s[len - 1- i]){
				yes = 0;
				break;
			}
		}
		if (yes) printf("yes\n");
		else printf("no\n");
	}
	return 0;
}

2030 汉字统计

回顾了汉字的编码方式,当连续识别到两个字节的首位都为1,那么这个字符是汉字。

即识别到的c<0,最后要除以2,来得到汉字的数量

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	scanf("%d", &n);
	getchar();
	char c;
	while (n--)
	{
		int num=0;
		while ((c = getchar())!= EOF&&c!='\n')
		{
			if (c < 0) num++;
		}
		printf("%d\n", num/2);
	}

	return 0;
}

2031 进制转换

这个按照要求,自己写一个例子然后照着例子编码即可。

HINT:注意正负

#include<iostream>
#include<algorithm>
#define maxn 1000000
char des[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int ans[maxn];
void solve(int n, int m);
int i = 0;
using namespace std;
int main()
{
	int n, m;
	while (scanf("%d%d", &n, &m) == 2)
	{
		if (n == 0)printf("0\n");
		solve(abs(n), m);
		if (n < 0)printf("-");
		while (i>0)
		{
			i--;
			printf("%c", des[ans[i]]);
		}
		printf("\n");
	}

	return 0;
}
void solve(int n, int m)
{
	while (n / m != 0)
	{
		ans[i++] = n%m;
		n = n / m;
	}
	ans[i++] = n%m;

}

2032杨辉三角

想起高中数学当中总是有这个玩意,其实也很简单,观察规律,先算个几十层的杨辉三角,然后输出即可。

#include<iostream>
#include<algorithm>
#define maxn 30+5
int first = 1;
int s[maxn][maxn];
using namespace std;
void output(int n) {
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			if(j==0)
				printf("%d", s[i][j]);
			else printf(" %d", s[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
int main()
{
	memset(s, 0, sizeof(s));
	for (int i = 0; i < 30; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			if (j == 0) s[i][j] = 1;
			else s[i][j] = s[i - 1][j] + s[i-1][j-1];
		}
	}
	int n;
	while (scanf("%d",&n)!=EOF)
	{
		output(n);
	}
	return 0;
}

2033 人见人爱A+B

这个按照题意来写即可。

HINT:可以直接计算出来,不用反复用其他的变量。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	scanf("%d", &n);
	getchar();
	int h, m, s, h1, m1, s1;
	while (n--)
	{
		scanf("%d%d%d%d%d%d", &h, &m, &s, &h1, &m1, &s1);
		h = ((s + s1) / 60 + m + m1) / 60 + h + h1;
		m = ((s + s1) / 60 + m + m1) % 60;
		s = (s + s1) % 60;
		printf("%d %d %d\n", h, m, s);
		getchar();
	}
	return 0;
}

2034 人见人爱A-B

这个题,我开始写了好久,最后一直WA,不晓得为啥。

思路是先把数组n记录,然后连续输入m个数,对数组n进行遍历,如果相同,则替换为一个无穷大的数字,排序后输出。

当然也需要记录那个无穷大的数值时候需要输出的问题。

然后换了一个思路,多开一个数组,用于存放结果,循环遍历数组n中的数是否需要输出。

#include<iostream>
#include<algorithm>
const int maxn = 110;
int in[maxn];
int im[maxn];
int ans[maxn];
using namespace std;
int main()
{
	int n, m;
	while (scanf("%d%d", &n, &m) == 2)
	{
		if (n == 0 && m == 0)break;
		for (int i = 0; i < n; i++)
			scanf("%d", &in[i]);
		for (int i = 0; i < m; i++)
			scanf("%d", &im[i]);
		int yes = 0, t = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++)
			{
				if (in[i] == im[j]) yes = 1;
			}
			if (yes == 0) ans[t++] = in[i];
			yes = 0;
		}
		if (t == 0) printf("NULL");
		else {
			sort(ans, ans + t);
			for (int i = 0; i < t; i++)
			{
				printf("%d ", ans[i]);
			}			
		}
		printf("\n");
	}

	return 0;
 }

PS:最近放假,然后又几天没有切水题啦,不过我会慢慢切完的。

2035 人见人爱A^B

这个题也很简单,考虑了a的b次方的后3位数字的影响的情况只可能和后面的那3位有关,即把大于1000的数值都过滤掉即可。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n, m;
	while (scanf("%d%d", &n, &m) == 2)
	{
		if (n == 0 && m == 0)break;
		int t=1;
		while (m--) {
			t = t*n % 1000;
		}
		printf("%d\n", t);
	}
	return 0;
}

2036 改革春风吹满地

这个题把思绪带回了高中数学,虽然大学里面也有线性代数课,不过早就忘记的差不多了,记得高中推过三角形的面积公式

S=|(x1*y2-x2*y1)/2|,其实也就是向量的叉积公式,上网查了一些资料,也确实是这样做的,自己画几个多边形然后分隔称为三角形,发现每次求的三角形的面积累加的那个面积是其中一条边都是这一次的一条边,还有下一次输入的点和这一次输入的点的边,因此需要赋值。

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int n;
	while (scanf("%d", &n) == 1 && n!=0)
	{
		int x1, y1, x2, y2;
		scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
		int T = n - 2;
		int x3, y3;
		double s = 0;
		while (T--)
		{
			scanf("%d%d", &x3, &y3);
			s += ((x1 - x2)*(y1 - y3) - (x1 - x3)*(y1 - y2))*1.0/2;
			x2 = x3;
			y2 = y3;
		}
		printf("%.1f\n",abs(s));
	}
	return 0;
}

2037 今年暑假不AC

本题是一个经典的贪心问题,原来上算法设计课的时候也做过,不过没太多印象了,当时好像是用数组且是自己写的排序算法。

这一次用struct作为数据结构,用sort来进行排序。

#include<cstdio>
#include<algorithm>
using namespace std;
struct node {
	int start, end;
	bool operator <(const node& w)const {
		return end < w.end;
	}
}s[105];
int main()
{
	int n;
	while (scanf("%d", &n) == 1)
	{
		if (n == 0)break;
		for (int i = 0; i < n; i++)
		{
			scanf("%d%d", &s[i].start, &s[i].end);
		}
		sort(s, s + n);
		/*for (int i = 0; i < n; i++) {
			printf("start:%d end:%d\n ",s[i].start, s[i].end);
		}*/
		int k = 1;
		int maxi = s[0].end;
		for (int i = 1; i < n; i++)
		{
			if (s[i].end > s[i - 1].end) {
				if (s[i].start >= maxi) {
					k++;
					maxi = s[i].end;
				}
			}
		}
		printf("%d\n", k);
	}
	return 0;
}

2038 ---

我也不知道为什么没有2038这个题,是不是因为不太吉祥???手动滑稽。

2039 三角形

HINT:三角形的三条边为double类型的

#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	scanf("%d", &n);
	double a, b, c;
	while (n--)
	{
		scanf("%lf%lf%lf", &a, &b, &c);
		if (a + b > c&&a + c > b&&b + c > a)
			printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

2040 亲和数

HINT:2边的都要相等

#include<cstdio>
#include<algorithm>
using namespace std;
bool sovle(int a,int b)
{
	int s1 = 0;
	for (int i = 1; i <= a/2; i++)
	{
		if (a%i == 0)s1 += i;
	}
	//printf("%d ", s1);
	int s2 = 0;
	for (int i = 1; i <= b / 2; i++)
	{
		if (b%i == 0)s2 += i;
	}
	//printf("%d", s2);
	return s1 == b&& s2 == a;
}
int main()
{
	int n;
	scanf("%d", &n);
	int a, b;
	while (n--)
	{
		scanf("%d%d", &a, &b);
		if(sovle(a, b)) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

2041 超级楼梯

HINT:本题采用递归时间会超时,所以打表即可。自己需要写几组数据来观察,发现这是斐波那契数列问题。

#include<cstdio>
#include<algorithm>
#include<time.h>
using namespace std;
const int maxn = 100000000;
int s[maxn];
int solve(int x)
{
	/*if (x == 1)return 1;
	else if (x == 2)return 1;
	else return solve(x - 1) + solve(x - 2);*/
	s[1] = 1;
	s[2] = 1;
	if (x >= 3) {
		for (int i = 3; i <= x; i++)
		{
			s[i] = s[i - 1] + s[i - 2];
		}
	}
	return s[x];
}
int main()
{
	int n;
	scanf("%d", &n);
	int x;
	while (n--) {
		scanf("%d", &x);
		int ans=solve(x);
		printf("%d\n",ans);
	}
	return 0;
}

2042 不容易系列之二

HINT:这个题和之前的一个题重复,没什么注意的。

#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	scanf("%d", &n);
	while (n--)
	{
		int a;
		scanf("%d", &a);
		int sum = 3;
		for (int i = 0; i < a; i++)
		{
			sum = (sum - 1) * 2;
		}
		printf("%d\n", sum);
	}
	return 0;
}

2043 密码

HINT:4个标志记得判断的时候别写重复了,自己就是因为这个WA了好几次

#include<cstdio>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		string s;
		cin >> s;
		int len = s.length();
		if (len >= 8 && len <= 16) {
			int ye1 = 1, ye2 = 1, ye3 = 1, ye4 = 1;
			int flag = 0;
			for (int i = 0; i < len; i++) {
				if (flag >= 3)break;
				if (s[i] >= 'A'&&s[i] <= 'Z') {
					if (ye1) {
						ye1 = 0;
						flag++;
					}
					continue;
				}
				else if (s[i] >= 'a'&&s[i] <= 'z') {
					if (ye2) {
						ye2 = 0;
						flag++;
					}
					continue;
				}
				else if (s[i] >= '0'&&s[i] <= '9')
				{
					if (ye3) {
						ye3 = 0;
						flag++;
					}
					continue;
				}
				else if(s[i]=='~'||s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$'||s[i]=='%'||s[i]=='^'){
					if (ye4) {
						ye4 = 0;
						flag++;
					}
				}
			}
			printf("%s\n", (flag >= 3) ? "YES" : "NO");
		}
		else {
			printf("NO\n");
		}
	}
	return 0;
}

2044 一只小蜜蜂

这个题和上楼梯的题的思路一样,f(n)=f(n-1)+f(n-2),即当小蜜蜂提留在第n个蜂房的时候,它可能是从第n-1个蜂房过来的,也可能是从第n-2个蜂房直接飞过来的。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 55;
long long s[maxn];
long long solve(int a, int b)
{
	int len = b - a;
	s[1] = 1;
	s[2] = 2;
	if (len >= 3) {
		for (int i = 3; i <= len; i++)
		{
			s[i] = s[i - 1] + s[i - 2];
		}
	}
	return s[len];
}
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		int a, b;
		cin >> a >> b;
		long long ans=solve(a, b);
		printf("%lld\n", ans);
	}
	return 0;
}

2045 不容易系列3-RPG难题

对于本题,画一个RPG随便以哪个开头的,然后观察规律得到结果最终乘以3即可。为N时最多可能有2^n个数需要减去上一次的值。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 50 + 5;
long long s[maxn];
long long solve(int n)
{
	s[1] = 1;
	s[2] = 2;
	long long temp = 4;
	if (n >= 3) {
		for (int i = 3; i <= n; i++)
		{
			s[i] = temp - s[i-1];
			temp *= 2;
			//printf("s[%d]:%d\n",i,s[i]);
		}
	}
	return s[n]*3;
}
int main()
{
	int n;
	while (scanf("%d",&n)!=EOF)
	{
		printf("%lld\n",solve(n));
	}
	return 0;
}

2046 骨牌铺方格

观察规律本题就是斐波那契数列题,f(n)=f(n-1)+f(n-2)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 55;
long long s[maxn];
long long sovle(int n)
{
	s[1] = 1;
	s[2] = 2;
	if (n >= 3) {
		for (int i = 3; i <= n; i++)
		{
			s[i] = s[i - 1] + s[i - 2];
		}
	}
	return s[n];
}
int main()
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		printf("%lld\n",sovle(n));
	}
	return 0;
}

2047 阿牛的EOF牛肉串

本题找规律,多画几组值出来就可以发现规律

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 45;
long long s[maxn];
long long solve(int n)
{
	s[1] = 3;
	long long a = 1, b = 2;
	for (int i = 2; i <= n; i++)
	{
		s[i] = s[i - 1] * 3 - a;
		a = b;
		b = s[i] - a;
	}
	return s[n];
}
int main()
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		printf("%lld\n",solve(n));
	}
	return 0;
}

2048 神、上帝以及老天爷

这个是错排问题,百度查的f(n)=(n-1)*(f(n-1)+f(n-2)),其中f(n-1)的那种情况我感觉特别别扭

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 55;
long long s[maxn];
double sovle(int n)
{
	s[1] = 0;
	s[2] = 1;
	if (n >= 3) {
		for (int i = 3; i <= n; i++)
		{
			s[i] = (i - 1)*(s[i - 1] + s[i - 2]);
		}
	}
	long long t = 1;
	for (int i = 1; i <= n; i++)
	{
		t *= i;
	}

	return s[n] * 100 * 1.0 / t;
}
int main()
{
	int n;
	scanf("%d", &n);
	while (n--)
	{
		int a;
		cin >> a;
		if (a > 10)a = 10;
		printf("%.2f%%\n", sovle(a));
	}
	return 0;
}

2049 不容易系列4-考新郎

这题是组合问题加上错排问题,组合Cmn*错排f(m),得到结果

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 25;
long long s[maxn];
long long u[maxn];
int main()
{
	int n;
	cin >> n;
	long long t = 1;
	u[0] = 1;
	s[1] = 0;
	s[2] = 1;
	for (int i = 1; i <= 20; i++)
	{
		t *= i;
		u[i] = t;
		if(i>=3)
			s[i] = (i - 1)*(s[i - 1] + s[i - 2]);
	}

	while (n--)
	{
		int a, b;
		cin >> a >> b;
		long long ans = u[a] / u[b] / u[a - b] * s[b];
		printf("%lld\n", ans);
	}

	return 0;
}

2050 折线分隔平面

本题是直线分隔平面问题,百度可以查到很多资料,最后得到公式f(n) = f(n-1)*4 + 2 - 1;

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 10000 + 10;
long long s[maxn];
int main()
{
	int n;
	cin >> n;
	s[1] = 2;
	for (int i = 2; i <= 10000; i++)
	{
		s[i] = s[i - 1] + 4 * (i - 1) + 1;
	}
	while (n--)
	{
		int a;
		cin >> a;
		cout << s[a] << endl;
	}
	return 0;
}

就这样写到2050题了,感觉水题ac的快乐没有做UVA上的题AC快乐,但是UVA上的不会写。。。能力不够水题来凑,较为尴尬。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值