杭电的题有时候题目给出是int,你找了半天错误以后发现改成其他的数据类型就对了,真是的啊!这几道题有涉及到汉字内码的问题,有贪心算法,有已知了点的坐标求多边形面积的问题,记住公式就ok了。

杭电ACM(2030-2039)

//2030汉字统计 汉字内码
#include <iostream>
#include <string>

using namespace std;

/*
汉字内码的特点是汉字用俩个字节来表示,每个字节的首位都是1,而在计算机内部数据是以补码的形式表示的,补码的最高位
为1代表的就是负数,所以汉字的俩个字节表示的都是负数,所以这里只要求出有多少个负数,然后除以2就得出了汉字的个数
*/

int main()
{
	int n;
	int count;
	cin>>n;
	cin.ignore();
	string str;
	for(int i=0;i<n;i++)
	{
		getline(cin,str);
		count = 0;
		for(int j=0;j<str.size();j++)
		{
			if(str[j] < 0)
				count++;
		}
		cout<<count/2<<endl;
	}

	return 0;
}

杭电ACM(2030-2039)

//2031进制转换
#include <iostream>
#include <string>
#include <math.h>

using namespace std;

int main()
{
	int n,r;
	string result;
	bool flag;

	while(cin>>n>>r)
	{
		result.clear();
		//flag中保存符号
		flag = true;
		if(n<0)
		{
			flag = false;
		}
		//将要转化的数变成正数
		n = abs(n);

		while(n != 0)
		{
			switch(n%r)
			{
			//result中保存的是余数,也就是转换后的进制数
			case 10:
				result.push_back('A');
				break;
			case 11:
				result.push_back('B');
				break;
			case 12:
				result.push_back('C');
				break;
			case 13:
				result.push_back('D');
				break;
			case 14:
				result.push_back('E');
				break;
			case 15:
				result.push_back('F');
				break;
			default:
				result.push_back(n%r+'0');
				break;
			}
			n = n/r;
		}

		//实现字符串的逆序输出
		string str(result.rbegin(),result.rend());
		//将符号添加到string中
		if(!flag)
			str.insert(0,1,'-');
		cout<<str<<endl;
	}

	return 0;
}

杭电ACM(2030-2039)

//2032杨辉三角
#include <iostream>

using namespace std;

int main()
{
	int n;
	//为num赋值
	int num[30][30];
	for(int i=0;i<30;i++)
	{
		for(int j=0;j<30;j++)
		{
			//每一行的第一个数为1,然后往右的数num[i][j]等于它上一行的俩个数num[i-1][j-1]和num[i-1][j]的和
			//第n行有n个数,最后一个数也为1
			if(j == 0 || i == j)
			{
				num[i][j] = 1;
				continue;
			}

			//第n行有n个数的体现
			if(i == j && i!=0)
				break;

			num[i][j] = num[i-1][j-1]+num[i-1][j];
		}
	}

	while(cin>>n)
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<i+1;j++)
			{
				if(j != 0)
					cout<<" ";
				cout<<num[i][j];
			}
			cout<<endl;
		}
		cout<<endl;
	}

	return 0;
}

杭电ACM(2030-2039)

//2033人见人爱A+B
#include <iostream>

using namespace std;

int main()
{
	int n;
	int ah,am,as,bh,bm,bs;
	int ch,cm,cs;
	cin>>n;

	for(int i=0;i<n;i++)
	{
		cin>>ah>>am>>as>>bh>>bm>>bs;
		cs = (as+bs)%60;
		cm = (am+bm)%60+(as+bs)/60;
		ch = ah+bh+(am+bm)/60;
		cout<<ch<<" "<<cm<<" "<<cs<<endl;
	}

	return 0;
}

杭电ACM(2030-2039)

//2034人见人爱A-B
#include <iostream>
#include <algorithm> //使用sort函数

using namespace std;

int main()
{
	int n,m;
	int * num_n;
	int * num_m;
	while(cin>>n>>m && (n!=0 || m!=0))
	{
		//分配内存空间
		num_n = new int[n];
		num_m = new int[m];
		//读入数据
		for(int i=0;i<n;i++)
			cin>>num_n[i];
		for(int i=0;i<m;i++)
			cin>>num_m[i];

		//因为要从小到大输出结果,所以这里对集合A中的元素做一个排序
		sort(num_n,num_n+n);

		int count = 0;
		for(int i=0;i<n;i++)
		{
			int j;
			for(j=0;j<m;j++)
			{
				if(num_n[i] == num_m[j])
				{
					break;
				}
			}
			if(j == m)
			{
				count++;
				cout<<num_n[i]<<" ";
			}
		}
		if(count == 0)
			cout<<"NULL";
		cout<<endl;

		delete [] num_n;
		delete [] num_m;
	}

	return 0;
}

杭电ACM(2030-2039)

//2035人见人爱A^B
#include <iostream>
#include <string>

using namespace std;

int main()
{
	long a,b;
	long result;
	string str;
	while(cin>>a>>b && (a!=0 || b!=0))
	{
		result = 1;
		for(int i=0;i<b;i++)
		{
			//只把结果的最后三位保留下来做进一步的运算,因为只有最后的三位才影响最终的结果
			result = result*a%1000;
		}
		cout<<result<<endl;
	}

	return 0;
}

杭电ACM(2030-2039)

//2036改革春风吹满地,已知了点的坐标,求多边形的面积
#include <iostream>
#include <iomanip>

using namespace std;

//定义点
struct point
{
	int x;
	int y;
};

int main()
{
	int n;
	double area;
	struct point * p;
	while(cin>>n && n!=0)
	{
		//读取输入数据
		p = new struct point[n];
		area = 0.0;
		for(int i=0;i<n;i++)
		{
			cin>>p[i].x>>p[i].y;
		}

		//使用以下的公式计算面积
		for(int i=0;i<n-1;i++)
		{
			area += p[i].x*p[i+1].y-p[i].y*p[i+1].x;
		}
		area += p[n-1].x*p[0].y-p[n-1].y*p[0].x;
		cout<<fixed<<setprecision(1)<<area/2<<endl;

		delete [] p;
	}

	return 0;
}

杭电ACM(2030-2039)

//2037今年暑假不AC,使用贪心算法来解决问题
#include <iostream>
#include <algorithm>

using namespace std;

struct mytime
{
	int x;
	int y;
};

bool cmp(struct mytime t1,struct mytime t2)
{
	return t1.y<t2.y;
}

int main()
{
	int n;
	struct mytime * t;
	//读入数据
	while(cin>>n && n!=0)
	{
		t = new struct mytime[n];
		for(int i=0;i<n;i++)
		{
			cin>>t[i].x>>t[i].y;
		}

		/*使用贪心算法来解决问题,贪心算法就是从当前的情况下出发,去寻找较优的解,但这个结果不一定就是最优解
		对于本题来说,要想看最多的电视节目,电视节目的结束时间就应该是最靠前的,这样剩下的时间就多,可以用来看
		更多的电视节目,所以从当前的情况下出发,就是要找到一个结束时间最早的。所以我们需要先对这个数组进行排序,
		将结束时间早的排在最前边,然后用结束的时间去和剩下的时间段的开始时间比较,如果满足可以完整的看完一个节目
		这个条件,就选择当前的时间段,然后再做比较,整个比较的过程都是从当前的情况下做比较的,这个就是贪心算法*/

		sort(t,t+n,cmp);
		int count = 1;
		for(int i=0;i<n;i++)
		{
			for(int j=i+1;j<n;j++)
			{
				if(t[i].y<=t[j].x)
				{
					count++;
					i = j-1;
					break;;
				}
			}
		}
		cout<<count<<endl;
		delete [] t;
	}

	return 0;
}

杭电ACM(2030-2039)

//2039三角形
#include <iostream>

using namespace std;

int main()
{
	int n;
	cin>>n;
	float a,b,c;

	for(int i=0;i<n;i++)
	{
		cin>>a>>b>>c;
		//判断能否构成三角形的条件:俩边之和大于第三边,俩边之差小于第三边
		if(a>b)
			swap(a,b);
		if(b>c)
		{
			swap(b,c);
			if(a>b)
				swap(a,b);
		}

		if(a+b>c && c-b<a)
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	}

	return 0;
}