一、L1-003 个位数统计
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M
的格式在一行中输出该位数字 D
及其在 N 中出现的次数 M
。要求按 D
的升序输出。
输入样例:
100311
输出样例:
0:2
1:3
3:1
代码:
void L1003(){
string s;
cin>>s;
vector<int>ar(10);
for(auto i : s){
ar[i-48]++;
}
for(int i = 0;i<10;i++){
if(ar[i]!=0){
cout<<i<<":"<<ar[i]<<endl;
}
}
}
二、L1-005 考试座位号
每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。
输入格式:
输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号
。其中准考证号
由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。
考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。
输出格式:
对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。
输入样例:
4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4
输出样例:
3310120150912002 2
3310120150912119 1
代码:
typedef struct stu{
string zh;
int sj;
int ks;
}S;
bool cmp(const S& a,const S& b){
return a.sj<b.sj;
}
void L1005(){
int n;
cin>>n;
vector<S>ar(n);
for(int i=0;i<n;i++){
cin>>ar[i].zh>>ar[i].sj>>ar[i].ks;
}
sort(ar.begin(),ar.end(),cmp);
int m;
cin>>m;
while(m--){
int a;
cin>>a;
cout<<ar[a-1].zh<<" "<<ar[a-1].ks<<endl;
}
}
三、L1-009 N个数求和
本题的要求很简单,就是求N
个数字的和。麻烦的是,这些数字是以有理数分子/分母
的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N
(≤100)。随后一行按格式a1/b1 a2/b2 ...
给出N
个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分
,其中分数部分写成分子/分母
,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1:
5
2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2
4/3 2/3
输出样例2:
2
输入样例3:
3
1/3 -1/6 1/8
输出样例3:
7/24
代码:
int gcd(int a,int c)
{
while(c!=0)
{
int t=a%c;
a=c;
c=t;
}
return a;
}
void L1009(){
int n;
cin>>n;
int fz = 0;
int fm = 1;
int a,b;
for(int i=0;i<n;i++){
scanf("%d/%d",&a,&b);
fz = fz*b + a*fm;
fm = b*fm;
int yue = gcd(fm,fz);
fz /=yue;
fm/=yue;
}
int refz =(double(fz)/fm);//3
if(fz%fm!=0&&refz!=0)
cout<<refz<<" "<<fz-refz*fm<<"/"<<fm<<endl;
else if(fz%fm==0&&refz!=0){
cout<<refz<<endl;
}else if(fz%fm!=0&&refz==0){
cout<<fz-refz*fm<<"/"<<fm<<endl;
}else
cout<<refz<<endl;
}
四、L1-011 A-B
本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A−B的结果字符串。
输入样例:
I love GPLT! It's a fun game!
aeiou
输出样例:
I lv GPLT! It's fn gm!
代码:
void L1011(){
string s,s1;
getline(cin,s);
getline(cin,s1);
for(int i = 0;i < s.size();i++){
if(!(s1.find(s[i])!=string::npos)){
cout<<s[i];
}
}
}
五、L1-020 帅到没朋友
当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。
输入格式:
输入第一行给出一个正整数N
(≤100),是已知朋友圈的个数;随后N
行,每行首先给出一个正整数K
(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M
(≤10000),为待查询的人数;随后一行中列出M
个待查询的ID,以空格分隔。
注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K
超过1的朋友圈里都至少有2个不同的人。
输出格式:
按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出No one is handsome
。
注意:同一个人可以被查询多次,但只输出一次。
输入样例1:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
输出样例1:
10000 88888 23333
输入样例2:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
输出样例2:
No one is handsome
代码:
void L1020(){
int n,m;
cin>>n;
set<int>res;
bool ar[1000000] = {false};
for(int i=0;i<n;i++){
cin>>m;
int c;
if(m==1){
cin>>c;
continue;
}else{
for(int j=0;j<m;j++){
cin>>c;
ar[c] = true;
}
}
}
int cn;
cin>>cn;
bool flag = false;
for(int i=0;i<cn;i++){
int a;
cin>>a;
if(res.count(a)||ar[a]==false){
if(!flag){
flag =true;
cout<<setw(5)<<setfill('0')<<a;
}else{
cout<<" ";
cout<<setw(5)<<setfill('0')<<a;
}
ar[a] = true;
}
}
if(!flag){
cout<<"No one is handsome";
}
}
六、L1-023 输出GPLT
给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....
这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT
的顺序打印,直到所有字符都被输出。
输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出样例:
GPLTGPLTGLTGLGLL
代码:
void L1023(){
string s;
cin>>s;
vector<int>ar(4);//GPLT
for(auto i:s){
if(i=='G'||i=='g'){
ar[0]++;
}else if(i=='P'||i=='p'){
ar[1]++;
}else if(i=='L'||i=='l'){
ar[2]++;
}else if(i=='T'||i=='t'){
ar[3]++;
}
}
char cs[]={'G','P','L','T'};
for(int i = 0;;i++){
if(ar[i%4]>0){
cout<<cs[i%4];
ar[i%4]--;
}
if(ar[0]==0&&ar[1]==0&&ar[2]==0&&ar[3]==0){
break;
}
}
}
七、L1-027 出租
下面是新浪微博上曾经很火的一张图:
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index
数组就是arr
数组的下标,index[0]=2
对应 arr[2]=1
,index[1]=0
对应 arr[0]=8
,index[2]=3
对应 arr[3]=0
,以此类推…… 很容易得到电话号码是18013820100
。
本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。
输入格式:
输入在一行中给出一个由11位数字组成的手机号码。
输出格式:
为输入的号码生成代码的前两行,其中arr
中的数字必须按递减顺序给出。
输入样例:
18013820100
输出样例:
int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};
代码:
void L1027(){
string s;
vector<int>num;
bool numid[10]={false};
cin>>s;
for(auto i :s){
if(numid[i-48]==false){
numid[i-48]=true;
num.push_back(i-48);
}
}
sort(num.begin(),num.end(),cmp1);
vector<int> index;
for(auto i : s){
vector<int>::iterator x = lower_bound(num.begin(),num.end(),i-48,cmp2);
index.push_back(distance(num.begin(),x)-1);
}
cout<<"int[] arr = new int[]{"<<num[0];
for(int i=1;i<num.size();i++){
cout<<","<<num[i];
}
cout<<"};"<<endl;
cout<<"int[] index = new int[]{"<<index[0];
for(int i=1;i<index.size();i++){
cout<<","<<index[i];
}
cout<<"};";
}