/*
*时间: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;
}
【PAT乙】1039/1042/1043/1047
最新推荐文章于 2022-03-22 12:05:47 发布