【PAT乙】1039/1042/1043/1047

22 篇文章 0 订阅
/*
*时间:2018年4月8日08:32:35-2018年4月8日08:50:28
*题号:1039. 到底买不买
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。
于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠
子;如果不是,那么告诉她缺了多少珠子。

为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那
么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并
且少了一颗红色的珠子。

图 1

输入格式:

每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000
个珠子。

输出格式:

如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠
子。其间以1个空格分隔。
输入样例1:

ppRYYGrrYBR2258
YrR8RrY

输出样例1:

Yes 8

输入样例2:

ppRYYGrrYB225
YrR8RrY

输出样例2:

No 2
*/

#include <iostream>
using namespace std;
#include <string.h>

int main()
{
	string store, wanted;
	cin>>store>>wanted;
	int lenS = store.size();       //卖的珠子的长度
	int lenW = wanted.size();      //想做的珠子的长度
	int everyStore[128] = {0};     //卖的珠子每种有多少颗
	int everyWanted[128] = {0};    //想做的珠子每种有多少颗
	int lack = 0;                  //卖的珠子离我想做的珠子相差多少颗(不分类)
	for (int i=0; i<lenS; i++)
		everyStore[store[i]]++;
	for (int i=0; i<lenW; i++)
		everyWanted[wanted[i]]++;
	for (int i=0; i<lenW; i++)      //遍历所以想要的珠子,看看卖的珠子每种是不是比自己想做的多,
	{								//比想做的少就加上缺少的颗数,使这类珠子缺少为0防止后面继续加缺少的颗数
		if (everyStore[wanted[i]] < everyWanted[wanted[i]])
		{
			lack += (everyWanted[wanted[i]] - everyStore[wanted[i]]);
			everyWanted[wanted[i]] = 0;
		}
			
	}
	if (lack > 0) //如果缺少,输出缺少多少颗
	{
		cout<<"No "<<lack<<endl;
	}
	else   //如果满足,输出多余多少颗(卖的珠子的长度减去自己想做的珠子的长度)
	{
		cout<<"Yes "<<(lenS - lenW)<<endl;
	}
	return 0;
}



/*
*时间:2018年4月8日09:10:16-2018年4月8日09:41:18
*题号:1042. 字符统计
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

请编写程序,找出一段给定文字中出现最频繁的那个英文字母。

输入格式:

输入在一行中给出一个长度不超过1000的字符串。字符串由ASCII码表中任意可见字符及空格组成,
至少包含1个英文字母,以回车结束(回车不算在内)。

输出格式:

在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出
按字母序最小的那个字母。统计时不区分大小写,输出小写字母。
输入样例:

This is a simple TEST.  There ARE numbers and other symbols 1&2&3...........

输出样例:

e 7
*/

#include <iostream>
using namespace std;
#include <string.h>
#include <vector>
#include <stdio.h>
#include <algorithm>
#define Debug false
struct word
{
	char wd;
	int num;
};
bool cmp(word a, word b)
{
	if (a.num != b.num) return (a.num > b.num);
	else return (a.wd < b.wd);
}

int main()
{
	vector <word> v;
	char in[1010];  //由于有空格,所以不能用string类型然后用cin读进来
	gets(in);       //读取字符数组用gets,记得加stdio的头文件还是加string,我记不清楚了
	int lenIn = strlen(in);
	if (Debug) printf("%d\n",lenIn);
	int wordNum[128] = {0}; //每种小写字母的个数,其实用26个就可以了,但是为了与ASCII码统一,防止转换,就写了128
	word temp;
	for (int i=0; i<lenIn; i++) //所有大写转换成小写,然后只统计小写的个数
	{
		if (in[i] >= 'A' && in[i] <= 'Z')
			in[i] += 32;
		if (in[i] >= 'a' && in[i] <= 'z')
			wordNum[in[i]]++;
	}
	for (int i=0; i<128; i++) //将字母和这个字母出现的次数写成一个结构体,再压入到容器里,后面进行排序
	{						  //其实直接遍历数组,用maxNum和maxId直接记录好像来的更方便,maxId只替换比现在次数大的,不替换相同的				
		if(wordNum[i] != 0)
		{
			temp.wd = i;
			temp.num = wordNum[i];
			v.push_back(temp);
		}
	}
	
	sort (v.begin(), v.end(), cmp); //排序,cmp中的排序法则是先比较次数大小,相同则比较字符的先后顺序
	if (Debug) for (int i=0; i<v.size(); i++)//Debug
	{
		printf("%c %d\n",v[i].wd, v[i].num);
	}
	printf("%c %d",v[0].wd, v[0].num);//把排在最前面的输出出来
	return 0;
}


/*
*时间:2018年4月8日12:38:38-2018年4月8日12:51:44
*题号:1043. 输出PATest
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,
按“PATestPATest....”这样的顺序输出,并忽略其它字符。当然,六种字符的个数不
一定是一样多的,若某种字符已经输出完,则余下的字符仍按PATest的顺序打印,直
到所有字符都被输出。

输入格式:

输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。

输出格式:

在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:

redlesPayBestPATTopTeePHPereatitAPPT

输出样例:

PATestPATestPTetPTePePee
*/

#include <iostream>
using namespace std;
#include <string.h>
int main()
{
	string in;
	cin>>in;
	int num_P = 0;
	int num_A = 0;
	int num_T = 0;
	int num_e = 0;
	int num_s = 0;
	int num_t = 0;
	int lenIn = in.size();
	for (int i=0; i<lenIn; i++)
	{
		if (in[i] == 'P') num_P++;
		else if (in[i] == 'A') num_A++;
		else if (in[i] == 'T') num_T++;
		else if (in[i] == 'e') num_e++;
		else if (in[i] == 's') num_s++;
		else if (in[i] == 't') num_t++;
		else continue;
	}
	for (int i=0; i<lenIn; i++)
	{
		if (num_P) {num_P--; cout<<"P";}
		if (num_A) {num_A--; cout<<"A";}
		if (num_T) {num_T--; cout<<"T";}
		if (num_e) {num_e--; cout<<"e";}
		if (num_s) {num_s--; cout<<"s";}
		if (num_t) {num_t--; cout<<"t";}
	}
	
	return 0;
}
/*
*这题就讲一下思路吧,没什么难点,记录PATest每个字符的个数,没输出一个相应的字符就减1;减到0就不输出
*/


/*
*时间:2018年4月8日18:02:39-2018年4月8日18:37:19
*题号:1047. 编程团体赛
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员
的成绩和;成绩最高的队获胜。

现给定所有队员的比赛成绩,请你编写程序找出冠军队。

输入格式:

输入第一行给出一个正整数N(<=10000),即所有参赛队员总数。随后N行,每行给出一位队员的
成绩,格式为:“队伍编号-队员编号 成绩”,其中“队伍编号”为1到1000的正整数,“队员编号”
为1到10的正整数,“成绩”为0到100的整数。

输出格式:

在一行中输出冠军队的编号和总成绩,其间以一个空格分隔。注意:题目保证冠军队是唯一的。
输入样例:

6
3-10 99
11-5 87
102-1 0
102-3 100
11-9 89
3-2 61

输出样例:

11 176
*/
//思路:用的还是散列的思想
//由于我读进来的时候是分成队伍加编号和分数两组读进来的,所以想到了用一个结构体来读
//由于队伍加编号中间有个‘-’,所以选择用字符串读进来比较方便
//所以这里就要处理一个字符串,不需要得到队员编号,只要统计每个队伍的,所以只需要得到队伍编号
//队伍编号在'-'前面,自己写了个findTeamNum函数将结构体直接转换成队伍的编号
//后面就用散列的方法直接统计每个队伍的得分之和,然后拿到最大的socre和id即可。
#include <iostream>
using namespace std;
#include <math.h>
struct scoreTeam  //用来读取队伍队员编号和分数的结构体
{
	string team;
	int score;
};
int findTeamNum (scoreTeam a)//通过结构体得到队伍编号
{
	int len = a.team.size();
	int teamNum = 0;
	for (int i=0; i<len; i++)
	{	
		//cout<<teamNum<<endl;
		if (a.team[i] == '-') break;
		teamNum = teamNum * 10 + a.team[i] - '0'; 	
	}
	return teamNum;
}

int main()
{
	int N;
	cin>>N;
	scoreTeam ST[N];
	int maxTeam;
	int maxScore = 0;
	int teamScore[1010] = {0};
	for (int i=0; i<N; i++)
	{
		cin>>ST[i].team>>ST[i].score;
	}
	for (int i=0; i<N; i++)
	{
		teamScore[findTeamNum(ST[i])] += ST[i].score;
	}
	for (int i=0; i<1010; i++)
	{
		if (teamScore[i] > maxScore)
		{
			maxScore = teamScore[i];
			maxTeam = i;
		}
	}
	cout<<maxTeam<<" "<<maxScore;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值