GPLT练习集L1 17--24

L1-017 到底有多二 (15 分)

题目描述

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。
本题就请你计算一个给定整数到底有多二。

输入格式:
输入第一行给出一个不超过50位的整数N。

输出格式:
在一行中输出N犯二的程度,保留小数点后两位。

输入样例:
-13142223336
*结尾无空行*

输出样例:
81.82%
*结尾无空行*

代码

#include<iostream>
#include<cstring>
#include<ctype.h>
using namespace std;
int main() {
	char s[50];
	scanf("%s",s);
	int n=strlen(s),k=0,j=0;
	for(int i=0 ; i<n ;i++)
		if(isdigit(s[i])) {
			k++;
			if(s[i] == '2')
				j++;
		}
	double t=(double)j/k;
	if(s[0] == '-')
		t*=1.5;
	if(s[n-1]%2 == 0)
		t*=2;
	printf("%.2lf%%",t*100);
  	return 0;
}

L1-018 大笨钟 (10 分)

题目描述

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。 下面就请你写个程序,根据当前时间替大笨钟敲钟。

输入格式:
输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。

输出格式:
根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:

Only hh:mm. Too early to Dang.
其中hh:mm是输入的时间。

输入样例1:
19:05
*结尾无空行*

输出样例1:
DangDangDangDangDangDangDangDang
*结尾无空行*

输入样例2:
07:05

输出样例2:
Only 07:05.  Too early to Dang.

代码

#include<iostream>
#include<cstring>
using namespace std;
int main() {
	int hh,mm;
	scanf("%d:%d",&hh,&mm);
	if(hh>12 && hh<24) {
		hh-=12;
		if(mm != 0)
			hh++;
		while(hh--)
			cout<<"Dang";
	}
	else
		printf("Only %02d:%02d.  Too early to Dang.",hh,mm);
  	return 0;
}

L1-019 谁先倒 (15 分)

题目描述

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(≤100),随后N行,每行给出一轮划拳的记录,
格式为:

甲喊 甲划 乙喊 乙划
其中喊是喊出的数字,划是划出的数字,均为不超过100的正整数(两只手一起划)。

输出格式:
在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,
后面的数据不必处理。

输入样例:
1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
*结尾无空行*

输出样例:
A
1

代码

#include <iostream>
using namespace std;

int main() {
	int j1,j2;
	cin>>j1>>j2;
	int J1=j1,J2=j2;
	int n;
    cin>>n;
	while(n--) {
 	int jia_han,jia_hua,yi_han,yi_hua;
		cin>>jia_han>>jia_hua>>yi_han>>yi_hua;
		int sum_han = jia_han + yi_han;
		if((jia_hua == sum_han) && (yi_hua != sum_han))//必须是只有一个人满足条件
		   	j1--;
		else if((yi_hua == sum_han) && (jia_hua != sum_han))
			j2--;
		if( j1 == -1 ) {
			cout<<"A\n"<<J2-j2;
			break;
		}
		else if (j2 == -1 ) {
			cout<<"B\n"<<J1-j1;
			break;
		}

	}
	return 0;
}

L1-020 帅到没朋友 (20 分)

题目描述

当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。
输入格式:
输入第一行给出一个正整数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

代码

#include <bits/stdc++.h>
using namespace std;

const int MAX = 100005;
int n,k,id,num[MAX],m,l,j;
int main() {
    cin >> n;
    while(n--) {
        cin >> k;
        for(int i = 0 ; i < k ; ++i) {
            cin >> id;
            if(k >= 2) 
                num[id] = 1;//利用存储数据,若id存在,置为1(开关)
        }
    }
    cin >> m;
    while(m--) {
        cin >> l;
        if(!num[l]) {
           printf("%05d",l);
           if(m > 1)
                cout << " ";
           j = 1;//(开关)若存在找不到这置为1
           num[l] = 1;//需要置为1
        }
    }
    if(!j)
        cout<<"No one is handsome";
	return 0;
}

说明

  1. 本 题 的 思 路 就 是 利 用 数 组 或 者 容 器 ( 一 般 数 据 量 大 , 不 知 道 大 小 用 容 器 方 便 ) 来 存 储 输 入 的 数 据 , 这 是 是 利 用 下 标 来 本题的思路就是利用数组或者容器(一般数据量大,不知道大小用容器方便)来存储输入的数据,这是是利用下标来 (,便),
    存 储 数 据 , 它 的 值 要 么 为 1 ( 存 在 就 输 出 ) , 要 么 为 0 ( 不 存 在 就 不 输 出 ) 存储数据,它的值要么为1(存在就输出),要么为0(不存在就不输出) ,1(),0()-----开关的应用
  2. 本 题 有 几 个 注 意 点 : 本题有几个注意点: :
    ① 当 朋 友 圈 中 只 有 一 个 人 时 , 这 个 人 的 数 据 不 需 要 被 存 储 , 直 接 输 入 就 行 ①当朋友圈中只有一个人时,这个人的数据不需要被存储,直接输入就行 ,,
    ② 当 一 个 人 符 合 输 出 条 件 时 , 只 能 输 入 一 次 , 故 到 最 后 要 把 它 存 入 数 组 , 并 置 为 1 ②当一个人符合输出条件时,只能输入一次,故到最后要把它存入数组,并置为1 ,,,1

L1-021 重要的话说三遍 (5 分)

题目描述

这道超级简单的题目没有任何输入。

你只需要把这句很重要的话 —— “I’m gonna WIN!”——连续输出三遍就可以了。

注意每遍占一行,除了每行的回车不能有任何多余字符。

输入样例:
无
*结尾无空行*

输出样例:
I'm gonna WIN!
I'm gonna WIN!
I'm gonna WIN!
*结尾无空行*

代码

#include<iostream>
using namespace std;
int main() {
    int n=3;
    while(n--)
            cout<<"I'm gonna WIN!"<<endl;
    return 0;
}

L1-022 奇偶分家 (10 分)

题目描述

给定N个正整数,请统计奇数和偶数各有多少个?

输入格式:
输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。

输出格式:
在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。

输入样例:
9
88 74 101 26 15 0 34 22 77
*结尾无空行*

输出样例:
3 6

代码

优化前

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int main() {
	int n,num[10000],j=0,k=0;
	cin>>n;
	for(int i=0 ; i<n; i++) {
		cin>>num[i];
		if(num[i]%2!=0)
			j++;
		else
			k++;
	}
	cout<<j<<" "<<k;
	return 0;

}

优化后

#include<bits/stdc++.h>
using namespace std;
int n,x,ans[5];
int main() {
    cin>>n;
    while(n--) {
        cin>>x;
        ans[x&1]++;//位运算
    }
    cout<<ans[1]<<' '<<ans[0]<<endl;
    return 0;
}
/*
二进制&运算 0&1为0 ; 1&1为1即:同为真为真,其他的为假
如3&1----- 0011   4&1----- 0100   
	    &  0001   		&  0001             
	       0001 		   0000
通过观察可知偶数二进制最后时0结尾,奇数是1结尾          
*/
说明

利 用 位 运 算 的 性 质 将 其 下 标 分 为 1 ( 奇 数 ) 和 0 ( 偶 数 ) 利用位运算的性质将其下标分为1(奇数)和0(偶数) 1()0()

L1-023 输出GPLT (20 分)

题目描述

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

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

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

输入样例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
*结尾无空行*

输出样例:
GPLTGPLTGLTGLGLL

代码

优化前

#include <iostream>
#include<stdio.h>
#include<ctype.h>
using namespace std;

int main() {
	char ch;
	int i=0,j=0,k=0,s=0;
	while((ch=getchar())!='\n') {
		if(ch == 'G'||ch == 'P'||ch == 'L'||ch == 'T'||ch == 'g'||ch == 'p'||ch == 'l'||ch == 't') {
			if(islower(ch))
				ch=toupper(ch);
			if(ch == 'G')
				i++;//G
			else if(ch == 'P')
				j++;//P
			else if(ch == 'L')
				k++;//L
			else if(ch == 'T')
				s++;//T
		}
	}
	while(j>0 || i>0 || k>0 || s>0) {
		if(i>0) {
			cout<<"G";
			i--;
		}
	 	if(j>0) {
			cout<<"P";
			j--;
		}
		if(k>0) {
			cout<<"L";
			k--;
		}
		if(s>0) {
			cout<<"T";
			s--;
		}
	}
	return 0;
}
说明

利 用 计 数 器 对 要 输 出 的 字 符 计 数 , 然 后 一 次 输 出 利用计数器对要输出的字符计数,然后一次输出 ,

利用map优化

#include<bits/stdc++.h>
using namespace std;
char x,y[]={'G','P','L','T'};
map<char,int>m;
int main() {
    while(cin>>x)
    	m[toupper(x)]++;
    while(m['G']+m['P']+m['L']+m['T']) {'+'相当于'||'
        for(int i=0;i<4;i++)
            if(m[y[i]]) {
                cout<<y[i];
                m[y[i]]--;
            }
    }
    return 0;
}
说明

思 路 就 是 利 用 数 组 或 m a p 容 器 来 存 储 说 输 入 的 数 据 , 然 后 按 照 规 则 一 次 输 出 思路就是利用数组或map容器来存储说输入的数据,然后按照规则一次输出 map,

L1-024 后天 (5 分)

题目描述

如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。

输入格式:
输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。

输出格式:
在一行中输出D天的后天是星期几。

输入样例:
*3
结尾无空行*

输出样例:
5
*结尾无空行*

代码

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int main() {
	int n;
	cin>>n;
	if(n>=6 && n<=7)
		cout<<n-5;
	else if(n>=1 && n<6)
		cout<<n+2;
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值