所有题目来源:团体程序设计天梯赛-练习集
https://pintia.cn/problem-sets/994805046380707840/problems/type/7
然后CSDN审核不通过,说与PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……) 高度相似(因为题目一样嘛),然后反馈了一下,未果,算了,就改为转载了,其实我都还没看过上面那篇文章,不过瞅了一眼,好像那篇文章看起来写的还不错,这里就当弄个传送门了。
下一篇 天梯赛历年部分真题
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
#include
#include
using namespace std;
int main(){
int n;
char c;
cin >> n >> c;
int t = 1;
while(2 * t * t - 1 <= n) {
t++;
}
t--;
int res = n - 2 * t * t + 1;
// 打印倒三角
for(int line = 1; line <= t; line++) {
for(int i = 1; i < line; i++)
cout << " ";
for(int i = 1; i <= 2 * (t - line + 1) - 1; i++)
cout << c;
cout << endl;
}
// 打印正三角,除了第一行
for(int line = 2; line <= t; line++) {
for(int i = 1; i <= t - line; i++)
cout << " ";
for(int i = 1; i <= 2 * line - 1; i++)
cout << c;
cout << endl;
}
cout << res;
}
给定一个 k 位整数
,请编写程序统计每种不同的个位数字出现的次数。例如:给定 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
#include
#include
using namespace std;
int main() {
string str;
cin >> str;
int record[10];
memset(record, 0, sizeof(record));
for(int i = 0; i < str.length(); i++)
record[str[i] - '0']++;
for(int i = 0; i <= 9; i++)
if (record[i] > 0)
cout << i << ":" << record[i] << endl;
}
给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。
输入格式:
输入在一行中给出一个华氏温度。
输出格式:
在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。
输入样例:
150
输出样例:
Celsius = 65
#include
#include
using namespace std;
int main() {
int f;
cin >> f;
cout << "Celsius = " << 5 * (f - 32) / 9;
}
每个 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
#include
#include
using namespace std;
int main() {
// 提交的时候记得注释掉
// freopen("E:/project/ClionProject/pta/input.txt", "r", stdin);
int totalNum;
const int maxNum = 1200;
long long info1[maxNum];
int info2[maxNum], info3[maxNum];
cin >> totalNum;
for(int i = 0; i < totalNum; i++)
cin >> info1[i] >> info2[i] >> info3[i];
// for(int i = 0; i < totalNum; i++)
// cout << info1[i] << " " << info2[i] << " " << info3[i] << endl;
int findNum;
cin >> findNum;
int findList[findNum];
for(int i = 0; i < findNum; i++)
cin >> findList[i];
// for(int i = 0; i < findNum; i++)
// cout << findList[i] << " ";
// 如果要提高效率,可以先排序,并且也可以写一个结构体
for(int i = 0; i < findNum; i++)
for (int j = 0; j < totalNum; j++)
if (info2[j] == findList[i]) {
cout << info1[j] << " " << info3[j] << endl;
break;
}
// fclose(stdin);
}
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
567
#include
#include
# include
using namespace std;
int Isprime(int n)/*判断素数*/
{
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
int n;
cin >> n;
// 如果是质数就没必要多白费力气了
if(Isprime(n))
{
cout << 1 << endl;
cout << n << endl;
return 0;
}
int maxSize = 0;
int maxStartIndex = 0;
for(int i = 2; i < sqrt(n); i++) {
int j;
if ( n % i == 0) {
int temp = i;
for (j = i + 1; j < sqrt(n); j++) {
temp *= j;
// 如果弄出来不是n的因子m 那就结束了
if (n % temp)
break;
}
if (maxSize < j - i) {
maxSize = j - i;
maxStartIndex = i;
}
}
}
cout << maxSize << endl;
for(int i = maxStartIndex; i < maxStartIndex + maxSize - 1; i++) {
cout << i << "*";
}
cout << maxStartIndex + maxSize - 1;
return 0;
}
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。
输入样例:
-600
输出样例:
fu liu ling ling
#include
#include
#include
#include
using namespace std;
int main() {
string str;
cin >> str;
unordered_map<char, string> myMap;
myMap['-'] = "fu";
myMap['0'] = "ling";
myMap['1'] = "yi";
myMap['2'] = "er";
myMap['3'] = "san";
myMap['4'] = "si";
myMap['5'] = "wu";
myMap['6'] = "liu";
myMap['7'] = "qi";
myMap['8'] = "ba";
myMap['9'] = "jiu";
for (int i = 0; i < str.length() - 1; i++)
cout << myMap[str[i]] << " ";
cout << myMap[str[str.length() - 1]];
return 0;
}
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输入格式:
输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。
输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。
输入样例:
-3 8
输出样例:
-3 -2 -1 0 1
2 3 4 5 6
7 8
Sum = 30
#include
#include
#include
# include
using namespace std;
int main() {
int a, b, sum = 0, index = 1;
cin >> a >> b;
for(int i = a; i <= b; i++) {
cout << setw(5) << setiosflags(ios::right) << i;
sum += i;
if (index % 5 == 0 && i != b)
cout << endl;
index++;
}
cout << endl << "Sum = " << sum << endl;
return 0;
}
本题的要求很简单,就是求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
还没AC, 只拿到 部分 分!!! 17/20
// 还没AC, 只拿到部分分!!!
#include
using namespace std;
int main()
{
int N;
cin >> N;
int fz = 0,fm = 1,zs; //分子fz、分母fm、整数部分zs
for(int i = 0; i < N; i++)
{
int t1,t2;
scanf("%d/%d",&t1,&t2);
fz = fz*t2 + fm*t1;
fm *= t2;
//化简分数之和
for(int j = fm; j > 1; j--)
{
if(fz%j==0 && fm%j==0)
{
fz /= j;
fm /= j;
}
}
}
if(abs(fz) >= fm)
{
zs = fz/fm;
fz = fz%fm;
}
if(zs != 0)
{
cout << zs;
}
if(zs!=0 && fz!=0)
{
cout << " ";
}
if(fz!=0)
{
printf("%d/%d",fz,fm);
}
if(zs==0 && fz == 0)
{
cout << 0;
}
return 0;
}
本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
4 2 8
输出样例:
2->4->8
#include
#include
#include
using namespace std;
int main() {
vector<int> a;
int temp;
for(int i = 0; i < 3; i++){
cin >> temp;
a.push_back(temp);
}
sort(a.begin(), a.end(), greater<>());
for(int i = 2; i > 0; i--)
cout << a[i] << "->";
cout << a[0];
return 0;
}
本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过10
4
,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A−B的结果字符串。
输入样例:
I love GPLT! It’s a fun game!
aeiou
输出样例:
I lv GPLT! It’s fn gm!
#include
#include
#include
using namespace std;
int main() {
string strA, strB;
getline(cin, strA);
getline(cin, strB);
// 其实也可以使用数组来做,不过这里我偷一下懒
unordered_map<char, int> myMap;
for(int i = 0; i < strB.length(); i++) {
myMap[strB[i]] = myMap[strB[i]] + 1;
}
// cout << strA << endl;
for(int i = 0; i < strA.length(); i++) {
if (!myMap[strA[i]])
cout << strA[i];
}
return 0;
}
真的没骗你,这道才是简单题 —— 对任意给定的不超过 10 的正整数 n,要求你输出 2
n
。不难吧?
输入格式:
输入在一行中给出一个不超过 10 的正整数 n。
输出格式:
在一行中按照格式 2^n = 计算结果 输出 2
n
的值。
输入样例:
5
输出样例:
2^5 = 32
此题顺带复习一下快速幂
#include
using namespace std;
int pow(int a, int n){
int ans = 1;
while(n){
if(n&1) //如果n的当前末位为1
ans *= a; //ans乘上当前的a
a *= a; //a自乘
n >>= 1; //n往右移一位
}
return ans;
}
int main() {
int n;
cin >> n;
cout << "2^" << n << " = " << pow(2, n);
return 0;
}
计算阶乘和 (10 分)
对于给定的正整数N,需要你计算 S=1!+2!+3!+…+N!。
输入格式:
输入在一行中给出一个不超过10的正整数N。
输出格式:
在一行中输出S的值。
输入样例:
3
输出样例:
9
#include
using namespace std;
int factorialSum(int n){
long res = 0;
long last = 1;
int fact = 1;
while(fact <= n) {
last *= fact;
res += last;
fact++;
}
return res;
}
int main() {
int n;
cin >> n;
cout << factorialSum(n);
return 0;
}
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!
输入格式:
输入在一行中给出正方形边长N(3≤N≤21)和组成正方形边的某种字符C,间隔一个空格。
输出格式:
输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。
输入样例:
10 a
输出样例:
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
#include
using namespace std;
int main() {
int col;
char c;
cin >> col >> c;
int row = col * 1.0 / 2 + 0.5;
for(int i = 1; i <= row; i++) {
for(int j = 1; j <= col; j++)
cout << c;
cout << endl;
}
}
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed
#include
#include
using namespace std;
int main() {
int weights[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
int map[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
vector<int> wrong;
int n;
cin >> n;
string str[n];
for (int i = 0; i < n; i++)
cin >> str[i];
for (int i = 0; i < n; i++) {
int temp = 0;
for (int j = 0; j < str[i].length() && j < 17; j++)
temp += weights[j] * (str[i][j] - '0');
if (map[temp % 11] != str[i][17])
wrong.push_back(i);
}
if (!wrong.empty()) {
for (int i = 0; i < wrong.size(); i++)
cout << str[wrong[i]] << endl;
} else {
cout << "All passed" << endl;
}
return 0;
}
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。
输入格式:
输入第一行给出一个不超过50位的整数N。
输出格式:
在一行中输出N犯二的程度,保留小数点后两位。
输入样例:
-13142223336
输出样例:
81.82%
#include
#include
#include
using namespace std;
int main() {
int numof2 = 0, even = 1;
double negative = 1;
string str;
cin >> str;
int totalNum = str.length();
if (str[0] == '-') {
negative = 1.5;
totalNum--; // 符号不能算
}
if ((str[str.length() - 1] - '0') % 2 == 0)
even = 2;
for(int i = 0; i < str.length(); i++) {
if (str[i] == '2')
numof2++;
}
// cout << numof2 << " " << totalNum << endl;
// cout << negative << " " << even << endl;
float res = numof2 * 1.0 / totalNum * negative * even * 100;
// cout << res << "%" << endl;
cout.setf(ios::fixed);
cout << setprecision(2) << res << "%" << endl;
return 0;
}
微博上有个自称“大笨钟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
#include
using namespace std;
int main() {
int h, m;
char c;
cin >> h >> c >> m;
if (h < 12 || h == 12 && m == 0){
cout << "Only ";
cout << setw(2) << setfill('0') << setiosflags(ios::right) << h << ":";
cout << setw(2) << setfill('0') << setiosflags(ios::right) << m;
cout << ". Too early to Dang.";
} else {
int num = h - 12;
if (m > 0)
num ++;
for(int i = 0; i < num; i++)
cout << "Dang";
}
return 0;
}
或者输出语句用一下C的 printf 好像更简便
#include
using namespace std;
int main() {
int h, m;
char c;
cin >> h >> c >> m;
if (h < 12 || h == 12 && m == 0){
printf("Only %02d:%02d. Too early to Dang.", h, m);
} else {
int num = h - 12;
if (m > 0)
num ++;
for(int i = 0; i < num; i++)
cout << "Dang";
}
return 0;
}
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过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
代码来源:https://blog.csdn.net/gdg_dys/article/details/60349381
#include
#include
#include
int main()
{
int n,m;
scanf("%d%d",&n,&m);/// 两个人的最大酒量
int t;
scanf("%d",&t);/// t组数据
int a,b,c,d;
int i=0,j=0;/// i 喝的杯数 j 喝的杯数
while(t--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);/// 一次划拳的数据
if( (b==a+c && d==a+c) || (b!=a+c && d!=a+c) )/// 两人同时赢 或者同时输
continue;
else if(b==a+c && d!=a+c )/// A喝酒
{
i++;
}
else if(b!=a+c && d==a+c)/// B 喝酒
{
j++;
}
if(i>n || j>m)/// 有一个人倒下就退出循环
{
while(t--)/// 继续输入完数据 但是不处理
{
scanf("%d%d%d%d",&a,&b,&c,&d);
}
break;
}
}
if(i>n)/// A 倒下
{
printf("A\n%d\n",j);///输出喝的杯数
}
else printf("B\n%d\n",i);/// B倒下
return 0;
}
当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。
输入格式:
输入第一行给出一个正整数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
#include
using namespace std;
int main() {
int n, x, nn;
int record[100000] = {0};
cin >> n;
for (int i = 0; i < n; i++) {
cin >> nn;
if (nn >= 2) {
for (int j = 0; j < nn; j++) {
cin >> x;
record[x] = 1;
}
} else {
cin >> x;
}
}
cin >> n;
int flag = 0;
for (int i = 0; i < n; i++) {
cin >> x;
// 如果没有朋友
if (!record[x]) {
if (flag)
cout << " ";
flag = 1;
cout << setiosflags(ios::right) << setfill('0') << setw(5) << x;
// 已经查过了
record[x] = 1;
}
}
if (!flag)
cout << "No one is handsome";
return 0;
}
这道超级简单的题目没有任何输入。
你只需要把这句很重要的话 —— “I’m gonna WIN!”——连续输出三遍就可以了。
注意每遍占一行,除了每行的回车不能有任何多余字符。
输入样例:
无
输出样例:
I’m gonna WIN!
I’m gonna WIN!
I’m gonna WIN!
#include
using namespace std;
int main(){
for (int i = 0; i < 3; i++)
cout << "I'm gonna WIN!" << endl;
}
给定N个正整数,请统计奇数和偶数各有多少个?
输入格式:
输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。
输出格式:
在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。
输入样例:
9
88 74 101 26 15 0 34 22 77
输出样例:
3 6
# include
using namespace std;
int main(){
int n, temp;
cin >> n;
int ogg = 0, even = 0;
for(int i = 0; i < n; i++) {
cin >> temp;
if (temp % 2)
ogg++;
else
even++;
}
cout << ogg << " " << even;
}
给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT…这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。
输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出样例:
GPLTGPLTGLTGLGLL
#include
#include
using namespace std;
int main() {
string str;
cin >> str;
int record[4] = {0};
for (int i = 0; i < str.length(); i++) {
if (str[i] == 'G' || str[i] == 'g')
record[0]++;
else if (str[i] == 'P' || str[i] == 'p')
record[1]++;
else if (str[i] == 'L' || str[i] == 'l')
record[2]++;
else if (str[i] == 'T' || str[i] == 't')
record[3]++;
}
int sum = record[0] + record[1] + record[2] + record[3];
while (sum) {
if (record[0]) {
cout << "G";
record[0]--;
sum--;
}
if (record[1]) {
cout << "P";
record[1]--;
sum--;
}
if (record[2]) {
cout << "L";
record[2]--;
sum--;
}
if (record[3]) {
cout << "T";
record[3]--;
sum--;
}
}
return 0;
}
如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。
输入格式:
输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。
输出格式:
在一行中输出D天的后天是星期几。
输入样例:
3
输出样例:
5
# include
using namespace std;
int main() {
int temp;
cin >> temp;
int res = (temp + 2) > 7 ? (temp + 2) % 7 : temp + 2;
cout << res;
}
题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
输入格式:
输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。
输出格式:
如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?。
输入样例1:
123 456
输出样例1:
123 + 456 = 579
输入样例2:
22. 18
输出样例2:
? + 18 = ?
输入样例3:
-100 blabla bla…33
输出样例3:
? + ? = ?
#include
#include
using namespace std;
int main(){
char a;
int s1 = 0, s2 = 0, flag1 = 0, flag2 = 0;
while ((a = getchar()) != EOF && a != ' ') {
if (a < '0' || a > '9')
flag1 = 1; // 出错了
s1 = s1 * 10 + a - '0';
if (s1 < 1 || s1 > 1000)
flag1 = 1;
}
while ((a = getchar()) != EOF && a != '\n') {
if (a < '0' || a > '9')
flag2 = 1; // 出错了
s2 = s2 * 10 + a - '0';
if (s2 < 1 || s2 > 1000)
flag2 = 1;
}
if (flag1 && flag2)
cout << "? + ? = ?";
else if (!flag1 && !flag2)
cout << s1 << " + " << s2 << " = " << s1 + s2;
else if (flag1)
cout << "? + " << s2 << " = ?";
else
cout << s1 << " + ? = ?";
return 0;
}
这道超级简单的题目没有任何输入。
你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。
所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
输入样例:
无
输出样例:
I
L
o
v
e
G
P
L
T
#include
using namespace std;
int main() {
string str = "I Love GPLT";
for (int i = 0; i < str.length(); i++)
cout << str[i] << endl;
return 0;
}
下面是新浪微博上曾经很火的一张图:
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,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};
#include
#include
using namespace std;
int main() {
string str;
cin >> str;
int record[10] = {0};
for (int i = 0; i < str.length(); i++) {
record[str[i] - '0']++;
}
int temp = 0;
unordered_map<int, int> indexMap;
string arr;
for(int i = 9; i >= 0; i--) {
if (record[i]) {
arr.append(to_string(i) + ',');
indexMap[i] = temp;
temp++;
}
}
if (arr.length() > 0)
arr.pop_back(); // 去掉最后的逗号
string index;
for (int i = 0; i < str.length(); i++) {
index.append(to_string(indexMap[str[i] - '0']) + ',');
}
if (index.length() > 0)
index.pop_back(); // 去掉最后的逗号
cout << "int[] arr = new int[]{" << arr << "};" << endl;
cout << "int[] index = new int[]{" << index << "};" << endl;
return 0;
}
本题的目标很简单,就是判断一个给定的正整数是否素数。
输入格式:
输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2
31
的需要判断的正整数。
输出格式:
对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。
输入样例:
2
11
111
输出样例:
Yes
No
#include
#include
using namespace std;
bool isPrime(int n) {
if (n == 1) {
return false;
}
for (int i = 2; i < sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
int n, x;
cin >> n;
while(n--) {
cin >> x;
if (isPrime(x)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
return 0;
}
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)
输入格式:
输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。
输出格式:
在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。
输入样例:
169
输出样例:
124.2
#include
#include
using namespace std;
int main() {
int h;
cin >> h;
cout << setiosflags(ios::fixed) << setprecision(1) << (h - 100) * 0.9 * 2 << endl;
return 0;
}
“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。
输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。
输入样例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
输出样例:
Amy Jack
Tom Linda
Bill Maya
Cindy John
#include
#include
#include
using namespace std;
struct Person{
int sex;
string name;
};
int main() {
int n;
Person person[52];
unordered_map<int, int> vis;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> person[i].sex >> person[i].name;
}
for (int i = 0; i < n / 2; i++) {
for (int j = n - 1; j >= n / 2; j--) {
if (person[i].sex != person[j].sex && !vis[j]) {
vis[j] = 1;
cout << person[i].name << " " << person[j].name << endl;
break;
}
}
}
}
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。
输入格式:
输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。
输出格式:
为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!。
输入样例:
3
169 136
150 81
178 155
输出样例:
You are wan mei!
You are tai shou le!
You are tai pang le!
#include
#include
#include
using namespace std;
int main() {
int n;
double h, w, s;
cin >> n;
while (n--) {
cin >> h >> w;
s = (h - 100) * 0.9 * 2; // 标准体重
if (w > (s * 0.9) && w < (s + s * 0.1))
cout << "You are wan mei!" << endl;
if (w >= (s + s * 0.1))
cout << "You are tai pang le!" << endl;
if (w <= (s - s * 0.1))
cout << "You are tai shou le!" << endl;
}
return 0;
}
这道题不知道为什么, 我把 s + s * 0.1 改为 s * 1.1 总是AC不了。
根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块?就是在字符串前填充一些东西到一定的长度。例如用去填充字符串GPLT,使之长度为10,调用left-pad的结果就应该是*****GPLT。Node社区曾经对left-pad紧急发布了一个替代,被严重吐槽。下面就请你来实现一下这个模块。
输入格式:
输入在第一行给出一个正整数N(≤10
4
)和一个字符,分别是填充结果字符串的长度和用于填充的字符,中间以1个空格分开。第二行给出原始的非空字符串,以回车结束。
输出格式:
在一行中输出结果字符串。
输入样例1:
15 _
I love GPLT
输出样例1:
____I love GPLT
输入样例2:
4 *
this is a sample for cut
输出样例2:
cut
#include
#include
using namespace std;
int main() {
int n;
char c;
string str;
cin >> n >> c;
getchar();
getline(cin, str);
int length = str.length();
// cout << length << endl;
if (length > n) {
str = str.substr(length - n, n);
} else {
for (int i = 0; i < n - length; i++)
cout << c;
}
cout << str;
return 0;
}
以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。
输入格式:
输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。
输出格式:
根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。
输入样例1:
1988 4
输出样例1:
25 2013
输入样例2:
1 2
输出样例2:
0 0001
#include
#include
#include
using namespace std;
int main() {
int year, n, type;
cin >> year >> n;
unordered_map<int, int> record;
for (int i = year; ; i++) {
type = 0;
record.clear();
record[i / 1000]++;
record[i / 100 % 10]++;
record[i / 10 % 10]++;
record[i % 10]++;
for(int j = 0; j < 10; j++)
if (record[j] > 0)
type++;
if (type == n) {
cout << i - year << " " << setfill('0') << setw(4) << i << endl;
break;
}
}
}
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。
输出格式:
统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔1个空格。如果有并列,则输出编号最大的那个。
输入样例:
4
3 889 233 2
5 100 3 233 2 73
4 3 73 889 2
2 233 123
输出样例:
233 3
#include
#include
using namespace std;
int main() {
int n, nn, x;
cin >> n;
int b[1001] = {0};
while(n--) {
cin >> nn;
while(nn--) {
cin >> x;
b[x]++;
}
}
int maxIndex = 0, maxValue = b[0];
for (int i = 1; i <= 1000; i++) {
if (maxValue <= b[i]) {
maxValue = b[i];
maxIndex = i;
}
}
cout << maxIndex << " " << maxValue;
return 0;
}
以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。
输入格式:
输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过10个英文字母的非空单词,以回车结束。一个英文句点.标志输入的结束,这个符号不算在点赞名单里。
输出格式:
根据点赞情况在一行中输出结论:若存在第2个人A和第14个人B,则输出“A and B are inviting you to dinner…”;若只有A没有B,则输出“A is the only one for you…”;若连A都没有,则输出“Momo… No one is for you …”。
输入样例1:
GaoXZh
Magi
Einst
Quark
LaoLao
FatMouse
ZhaShen
fantacy
latesum
SenSen
QuanQuan
whatever
whenever
Potaty
hahaha
.
输出样例1:
Magi and Potaty are inviting you to dinner…
输入样例2:
LaoLao
FatMouse
whoever
.
输出样例2:
FatMouse is the only one for you…
输入样例3:
LaoLao
.
输出样例3:
Momo… No one is for you …
#include
#include
using namespace std;
int main() {
int index = 0;
string x, v2, v14;
while (true) {
cin >> x;
if (x == ".") {
break;
}
index++;
if (index == 2) {
v2 = x;
} else if (index == 14) {
v14 = x;
}
}
// cout << endl << "index: " << index << endl;
if (index >= 14) {
cout << v2 << " and " << v14 << " are inviting you to dinner..." << endl;
} else if (index >= 2) {
cout << v2 << " is the only one for you..." << endl;
} else { // index < 2
cout << "Momo... No one is for you ..." << endl;
}
return 0;
}
看我没骗你吧 —— 这是一道你可以在 10 秒内完成的题:给定两个绝对值不超过 100 的整数 A 和 B,输出 A 乘以 B 的值。
输入格式:
输入在第一行给出两个整数 A 和 B(−100≤A,B≤100),数字间以空格分隔。
输出格式:
在一行中输出 A 乘以 B 的值。
输入样例:
-8 13
输出样例:
-104
#include
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << a * b << endl;
return 0;
}
真的是简单题哈 —— 给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。
输入格式:
输入在第一行给出两个整数A和B(−100≤A,B≤100),数字间以空格分隔。
输出格式:
在一行中输出结果:如果分母是正数,则输出“A/B=商”;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为Error。输出的商应保留小数点后2位。
输入样例1:
-1 2
输出样例1:
-1/2=-0.50
输入样例2:
1 -3
输出样例2:
1/(-3)=-0.33
输入样例3:
5 0
输出样例3:
5/0=Error
#include
#include
using namespace std;
int main() {
int x, y;
cin >> x >> y;
if (y == 0) {
cout << x << "/" << y << "=" << "Error" << endl;
} else {
cout << x << "/";
if (y < 0) {
cout << "(" << y << ")";
} else {
cout << y;
}
cout << "=";
cout << setiosflags(ios::fixed) << setprecision(2) << x * 1.0 / y << endl;
}
return 0;
}
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
#include
#include
#include
using namespace std;
int main() {
int n;
string str;
cin >> n;
getchar(); // 把空格吃掉 ^_^
getline(cin, str);
int colNum = ceil(str.length() * 1.0 / n);
int spaceNum = colNum * n - str.length();
// cout << rowNum << " " << str.length() << " " << n << endl;
// cout << "spaceNum: " << spaceNum << endl;
for (int i = 0; i < spaceNum; i++)
str += " ";
// cout << str.length();
// cout << rowNum << endl;
int index = str.length() - 1;
char matrix[n][colNum];
for (int col = 0; col < colNum; col++) {
for (int row = n - 1; row >= 0; row--) {
matrix[row][col] = str[index--];
}
}
for (int row = 0; row < n; row++) {
for (int col = 0; col < colNum; col++)
cout << matrix[row][col];
cout << endl;
}
return 0;
}
专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。
下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。
输入格式:
输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。
输出格式:
对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。
输入样例:
2
M 1.75
F 1.8
输出样例:
1.61
1.96
#include
#include
#include
using namespace std;
int main() {
int n;
char sex;
double h;
cin >> n;
while(n--) {
cin >> sex >> h;
if (sex == 'M')
cout << setiosflags(ios::fixed) << setprecision(2) << h / 1.09 << endl;
else if (sex == 'F')
cout << setiosflags(ios::fixed) << setprecision(2) << h * 1.09 << endl;
}
return 0;
}
对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。
输入格式:
输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。
输出格式:
在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。
输入样例:
888 666 123 -233 250 13 250 -222
输出样例:
5
# include
using namespace std;
int main() {
int index = 0, x, pos = 0, flag = 1;
while(cin >> x) {
index++;
if (x == 250 && flag) {
pos = index;
flag = 0;
}
}
cout << pos;
}
世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
输入格式:
输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。
输出格式:
在一行中按照“yyyy-mm-dd”的格式给出年、月、日。
输入样例:
03-15-2017
输出样例:
2017-03-15
#include
#include
using namespace std;
int main(){
char year[10];
char result[10];
memset(result, '-', sizeof (result));
cin >> year;
for (int i = 0; i < 4; i++)
result[i] = year[6 + i];
result[5] = year[0];
result[6] = year[1];
result[8] = year[3];
result[9] = year[4];
cout << result << endl;
}
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
输入格式:
输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:
书号([1, 1000]内的整数) 键值(S或E) 发生时间(hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)
每一天的纪录保证按时间递增的顺序给出。
输出格式:
对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。
输入样例:
3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00
输出样例:
2 196
0 0
1 60
#include
#include
using namespace std;
int main(){
int n, cnt, hour, min, id;
double sum;
string tag;
char c;
unordered_map<int, string> bookMap;
unordered_map<int, int> timeMap;
cin >> n;
for(int i = 0; i < n; i++) {
sum = cnt = 0;
bookMap.clear();
timeMap.clear();
while (true) {
cin >> id >> tag >> hour >> c >> min;
if (id == 0)
break;
if (tag == "S") {
bookMap[id] = "S";
timeMap[id] = hour * 60 + min;
} else if (tag == "E" && bookMap[id] == "S") {
bookMap[id] = "E";
cnt++;
sum += hour * 60 + min - timeMap[id];
}
}
if (cnt)
sum = sum / cnt;
cout << cnt << " " << int(sum + 0.5) << endl;
}
}
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每隔K次就让一个平局。
输入格式:
输入首先在第一行给出正整数K(≤10),即平局间隔的次数。随后每行给出对方的一次出招:ChuiZi代表“锤子”、JianDao代表“剪刀”、Bu代表“布”。End代表输入结束,这一行不要作为出招处理。
输出格式:
对每一个输入的出招,按要求输出稳赢或平局的招式。每招占一行。
输入样例:
2
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
ChuiZi
End
输出样例:
Bu
ChuiZi
Bu
ChuiZi
JianDao
ChuiZi
Bu
#include
#include
using namespace std;
int main() {
int n;
cin >> n;
map<string, string> myMap;
myMap["ChuiZi"] = "Bu";
myMap["JianDao"] = "ChuiZi";
myMap["Bu"] = "JianDao";
string x;
int count = 0;
while(cin >> x, x != "End") {
count++;
if (count != 0 && count % (n + 1) == 0) {
cout << x << endl;
} else {
cout << myMap[x] << endl;
}
}
return 0;
}
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。
提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。
输入格式:
输入在一行中给出一个不以5结尾的正奇数x(<1000)。
输出格式:
在一行中输出相应的最小的s和n,其间以1个空格分隔。
输入样例:
31
输出样例:
3584229390681 15
#include
using namespace std;
int main() {
int n, m = 1, count = 1;
cin >> n;
// 先确保 m 大于 n 先
while (m < n) {
m = 10 * m + 1;
count++;
}
while (true) {
// 这一步很巧妙, 希望仔细体会
cout << m / n;
if (m % n == 0)
break;
// 配合上面那一步cout
m = (m % n) * 10 + 1;
count++;
}
cout << " " << count << endl;
return 0;
}
你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。
输入格式:
输入在第一行给出一个正整数N(≤10)。随后N行,每行给出一个人的名字(仅由英文字母组成的、长度不超过3个字符的串)、其呼吸频率和脉搏(均为不超过100的正整数)。
输出格式:
按照输入顺序检查每个人,如果其至少一项指标不在正常范围内,则输出其名字,每个名字占一行。
输入样例:
4
Amy 15 70
Tom 14 60
Joe 18 50
Zoe 21 71
输出样例:
Tom
Zoe
#include
using namespace std;
int main() {
int n, x, y;
cin >> n;
string name;
while (n--) {
cin >> name >> x >> y;
if (x < 15 || x > 20 || y < 50 || y > 70) {
cout << name << endl;
}
}
return 0;
}
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有R
a
行、C
a
列,B有R
b
行、C
b
列,则只有C
a
与R
b
相等时,两个矩阵才能相乘。
输入格式:
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。
输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。
输入样例1:
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例1:
2 4
20 22 24 16
53 58 63 28
输入样例2:
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例2:
Error: 2 != 3
#include
using namespace std;
int main() {
int r1, c1, r2, c2;
cin >> r1 >> c1;
int a[r1][c1];
for(int i = 0; i < r1; i++) {
for (int j = 0; j < c1; j++)
cin >> a[i][j];
}
cin >> r2 >> c2;
int b[r2][c2];
for(int i = 0; i < r2; i++) {
for (int j = 0; j < c2; j++)
cin >> b[i][j];
}
if (c1 != r2) {
cout << "Error: " << c1 << " != " << r2 << endl;
} else {
int c[r1][c2];
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) {
c[i][j] = 0;
for (int k = 0; k < c1; k++) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
cout << r1 << " " << c2 << endl;
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) {
cout << c[i][j];
if (j != c2 - 1)
cout << " ";
}
cout << endl;
}
}
return 0;
}
天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。
输入格式:
输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。
输出格式:
从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。
输入样例:
3
3 4 2
输出样例:
#1
1 4 7 10 13 16 19 22 25 28
31 34 37 40 43 46 49 52 55 58
61 63 65 67 69 71 73 75 77 79
#2
2 5 8 11 14 17 20 23 26 29
32 35 38 41 44 47 50 53 56 59
62 64 66 68 70 72 74 76 78 80
82 84 86 88 90 92 94 96 98 100
#3
3 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60
#include
#include
using namespace std;
int main() {
int n;
cin >> n;
int num[n];
vector<vector<int>> res;
for (int i = 0; i < n; i++) {
cin >> num[i];
num[i] *= 10;
}
// cout << "!!!!!" << endl;
// for (int i = 0; i < n; i++)
// cout << num[i] << " ";
for (int i = 0; i < n; i++) {
vector<int> a;
res.push_back(a);
}
// res[0].push_back(250);
// res[1].push_back(1234);
// res[1].push_back(4567);
// res[1].push_back(7);
// res[2].push_back(897);
int curNum = n; // 现在还未安排的学校数目
int totalStu = 0;
int pos = 1;
for (int i = 0; i < n; i++)
totalStu += num[i];
int i = -1;
while (totalStu) {
i = (i + 1) % n;
if (curNum == 1) // 如果仅剩下一个学校
break;
if (num[i]) {
res[i].push_back(pos);
pos++;
num[i]--;
totalStu--;
if (num[i] == 0) {
curNum--;
}
}
}
// 先找出那个学校的下标
int lastSchoolIndex = 0;
for (i = 0; i < n; i++) {
if (num[i]) {
lastSchoolIndex = i;
break;
}
}
// cout << "index: " << lastSchoolIndex << endl;
// 如果还有某个学校未安排, 此时这个作为是这个学校的
res[lastSchoolIndex].push_back(pos);
totalStu--;
// 如果还是有学生没有被安排作为
while (totalStu) {
pos += 2;
res[lastSchoolIndex].push_back(pos);
totalStu--;
}
for (i = 0; i < n; i++) {
cout << "#" << i + 1 << endl;
for (int j = 0; j < res[i].size(); j++) {
cout << res[i][j];
if (j != res[i].size() - 1) {
if ((j + 1) % 10 == 0)
cout << endl;
else
cout << " ";
}
}
cout << endl;
}
return 0;
}
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, …, aaz, aba, abb, …, abz, …, zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。
输入格式:
输入在一行中给出两个正整数 L(2 ≤ L ≤ 6)和 N(≤10
5
)。
输出格式:
在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。
输入样例:
3 7417
输出样例:
pat
#include
#include
using namespace std;
int main() {
int n, x;
cin >> n >> x;
x--;
vector<char> charMap;
string alpha = "abcdefghijklmnopqrstuvwxyz";
for (int i = alpha.length() - 1; i >= 0; i--) {
charMap.push_back(alpha[i]);
}
// for (int i = 0; i < charMap.size(); i++)
// cout << charMap[i] << " ";
string res;
while (res.length() < n) {
// cout << "this: " << charMap[x % 26] << endl;
res = charMap[x % 26] + res;
x = x / 26;
}
cout << res << endl;
return 0;
}
去商场淘打折商品时,计算打折以后的价钱是件颇费脑子的事情。例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% = ¥691.60。本题就请你写个程序替客户计算折扣价。
输入格式:
输入在一行中给出商品的原价(不超过1万元的正整数)和折扣(为[1, 9]区间内的整数),其间以空格分隔。
输出格式:
在一行中输出商品的折扣价,保留小数点后 2 位。
输入样例:
988 7
输出样例:
691.60
# include
# include
using namespace std;
int main() {
int x, y;
cin >> x >> y;
double res = x * y * 1.0 / 10;
cout << setiosflags(ios::fixed) << setprecision(2) << res << endl;
}
据说汪星人的智商能达到人类 4 岁儿童的水平,更有些聪明汪会做加法计算。比如你在地上放两堆小球,分别有 1 只球和 2 只球,聪明汪就会用“汪!汪!汪!”表示 1 加 2 的结果是 3。
本题要求你为电子宠物汪做一个模拟程序,根据电子眼识别出的两堆小球的个数,计算出和,并且用汪星人的叫声给出答案。
输入格式:
输入在一行中给出两个 [1, 9] 区间内的正整数 A 和 B,用空格分隔。
输出格式:
在一行中输出 A + B 个Wang!。
输入样例:
2 1
输出样例:
Wang!Wang!Wang!
# include
# include
using namespace std;
int main() {
int x, y;
cin >> x >> y;
int n = x + y;
for (int i = 0; i < n; i++)
cout << "Wang!";
}
“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格。而倒过来的汉字所用的字符由裁判指定。
输入格式:
输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为 @ 或者为空格。
输出格式:
输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出bu yong dao le,然后再用输入指定的字符将其输出。
输入样例 1:
$ 9
@ @@@@@
@@@ @@@
@ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
@ @ @ @
@ @@@@@
输出样例 1:
$$$$$ $
$ $ $ $
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$
$$$ $$$
$ $ $
$$$ $$$
$$$$$ $
输入样例 2:
& 3
@@@
@
@@@
输出样例 2:
bu yong dao le
&&&
&
&&&
# include
# include
using namespace std;
int main() {
int n;
char c;
cin >> c >> n;
getchar();
map<char, char> myMap;
myMap['@'] = c;
myMap[' '] = ' ';
char a[n][n], b[n][n];
string str;
for (int i = 0; i < n; i++) {
getline(cin, str);
for (int j = 0; j < str.length(); j++) {
a[i][j] = str[j];
b[n - i - 1][n - j - 1] = a[i][j];
}
}
// for (int i = 0; i < n; i++) {
// for (int j = 0; j < n; j++) {
// cout << a[i][j];
// }
// cout << endl;
// }
int flag = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] != b[i][j]) {
flag = 0;
break;
}
}
}
if (flag)
cout << "bu yong dao le" << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << myMap[b[i][j]];
}
cout << endl;
}
return 0;
}
某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定。规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出;或艺人的观众票数低,但得到全部评委的认可,也可以胜出。节目保证投票的观众人数为奇数,所以不存在平票的情况。本题就请你用程序判断谁是赢家。
输入格式:
输入第一行给出 2 个不超过 1000 的正整数 Pa 和 Pb,分别是艺人 a 和艺人 b 得到的观众票数。题目保证这两个数字不相等。随后第二行给出 3 名评委的投票结果。数字 0 代表投票给 a,数字 1 代表投票给 b,其间以一个空格分隔。
输出格式:
按以下格式输出赢家:
The winner is x: P1 + P2
其中 x 是代表赢家的字母,P1 是赢家得到的观众票数,P2 是赢家得到的评委票数。
输入样例:
327 129
1 0 1
输出样例:
The winner is a: 327 + 1
# include
# include
using namespace std;
int main() {
int x, y, a[3];
cin >> x >> y;
cin >> a[0] >> a[1] >> a[2];
int z = a[0] + a[1] + a[2]; // 1代表投票给b
if (z == 3) {
cout << "The winner is b: " << y << " + " << z;
} else if (!z) {
cout << "The winner is a: " << x << " + " << 3 - z;
} else {
if (x > y) {
cout << "The winner is a: " << x << " + " << 3 - z;
} else {
cout << "The winner is b: " << y << " + " << z;
}
}
return 0;
}
“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!
本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。
输入格式:
输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。
输出格式:
从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。
输入样例:
it is so 666 really 6666 what else can I say 6666666666
输出样例:
it is so 666 really 9 what else can I say 27
# include
# include
using namespace std;
int main() {
string str;
getline(cin, str);
int count;
for (int i = 0; i < str.length(); i++) {
count = 0;
while (str[i] == '6') {
i++;
count++;
}
if (count > 9)
cout << "27";
else if (count > 3)
cout << "9";
else
cout << string(count, '6');
cout << str[i];
}
return 0;
}
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。
现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。
输入格式:
输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。
输出格式:
对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。
输入样例
5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.
输出样例:
xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped
#include
using namespace std;
int main() {
int n, length, x, i, j, cnt;
cin >> n;
getchar();
string str;
while (n--) {
cnt = 0;
getline(cin, str);
length = str.length();
if (str[length - 2] == 'g' && str[length - 3] == 'n' && str[length - 4] == 'o') {
x = str.find(',');
if (str[x - 1] == 'g' && str[x - 2] == 'n' && str[x - 3] == 'o') {
for (j = length - 1; j >= 0; j--) {
if (str[j] == ' ') {
cnt++;
if (cnt == 3)
break;
}
}
for (i = 0; i <= j; i++)
cout << str[i];
cout << "qiao ben zhong." << endl;
} else {
cout << "Skipped" << endl;
}
} else {
cout << "Skipped" << endl;
}
}
}
这是一幅心理阴影面积图。我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线)。由红、蓝线围出的面积,就是我们在做作业时的心理阴影面积。
现给出红色拐点的坐标 (x,y),要求你算出这个心理阴影面积。
输入格式:
输入在一行中给出 2 个不超过 100 的正整数 x 和 y,并且保证有 x>y。这里假设横、纵坐标的最大值(即截止日和最终完成度)都是 100。
输出格式:
在一行中输出心理阴影面积。
友情提醒:三角形的面积 = 底边长 x 高 / 2;矩形面积 = 底边长 x 高。嫑想得太复杂,这是一道 5 分考减法的题……
输入样例:
90 10
输出样例:
4000
# include
# include
using namespace std;
int main() {
int x, y;
cin >> x >> y;
int res = 100 * 100 / 2 - (100 - x) * y - (100 - x) * (100 - y) / 2 - x * y / 2;
cout << res;
return 0;
}
根据钱江晚报官方微博的报导,最新的肥胖计算方法为:体重(kg) / 身高(m) 的平方。如果超过 25,你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。
输入格式:
输入在一行中给出两个正数,依次为一个人的体重(以 kg 为单位)和身高(以 m 为单位),其间以空格分隔。其中体重不超过 1000 kg,身高不超过 3.0 m。
输出格式:
首先输出将该人的体重和身高代入肥胖公式的计算结果,保留小数点后 1 位。如果这个数值大于 25,就在第二行输出 PANG,否则输出 Hai Xing。
输入样例 1:
100.1 1.74
输出样例 1:
33.1
PANG
输入样例 2:
65 1.70
输出样例 2:
22.5
Hai Xing
# include
#include
using namespace std;
int main() {
double w, h;
cin >> w >> h;
double res = w / (h * h);
cout << setiosflags(ios::fixed) << setprecision(1) << res << endl;
if (res > 25)
cout << "PANG";
else
cout << "Hai Xing";
return 0;
}
彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。
输入格式:
输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一张彩票的 6 位数字。
输出格式:
对每张彩票,如果它是幸运的,就在一行中输出 You are lucky!;否则输出 Wish you good luck.。
输入样例:
2
233008
123456
输出样例:
You are lucky!
Wish you good luck.
# include
#include
using namespace std;
int main() {
int n;
cin >> n;
string str;
int former, latter;
while (n--) {
cin >> str;
former = latter = 0;
for (int i = 0; i < 3; i++)
former += str[i] - '0';
for (int i = 3; i < 6; i++)
latter += str[i] - '0';
if (former == latter)
cout << "You are lucky!" << endl;
else
cout << "Wish you good luck." << endl;
}
return 0;
}
国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。
现在你要根据小宝宝的身高体重,给出补充营养的建议。
输入格式:
输入在第一行给出一个不超过 10 的正整数 N,随后 N 行,每行给出一位宝宝的身体数据:
性别 身高 体重
其中性别是 1 表示男生,0 表示女生。身高和体重都是不超过 200 的正整数。
输出格式:
对于每一位宝宝,在一行中给出你的建议:
如果太矮了,输出:duo chi yu!(多吃鱼);
如果太瘦了,输出:duo chi rou!(多吃肉);
如果正标准,输出:wan mei!(完美);
如果太高了,输出:ni li hai!(你厉害);
如果太胖了,输出:shao chi rou!(少吃肉)。
先评价身高,再评价体重。两句话之间要有 1 个空格。
输入样例:
4
0 130 23
1 129 27
1 130 30
0 128 27
输出样例:
ni li hai! duo chi rou!
duo chi yu! wan mei!
wan mei! shao chi rou!
duo chi yu! shao chi rou!
# include
#include
using namespace std;
int main() {
int n, sex, h, w;
cin >> n;
while (n--) {
cin >> sex >> h >> w;
int standard[2][2] = {{129, 25},
{130, 27}};
if (h == standard[sex][0])
cout << "wan mei! ";
else if (h < standard[sex][0])
cout << "duo chi yu! ";
else if (h > standard[sex][0])
cout << "ni li hai! ";
if (w == standard[sex][1])
cout << "wan mei!" << endl;
else if (w > standard[sex][1])
cout << "shao chi rou!" << endl;
else if (w < standard[sex][1])
cout << "duo chi rou!" << endl;
}
return 0;
}
在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。
输入格式:
输入在第一行给出一个正整数N(≤104),是已知小圈子的个数。随后N行,每行按下列格式给出一个小圈子里的人:
K P[1] P[2] ⋯ P[K]
其中K是小圈子里的人数,P[i](i=1,⋯,K)是小圈子里每个人的编号。这里所有人的编号从1开始连续编号,最大编号不会超过10
4。
之后一行给出一个非负整数Q(≤104),是查询次数。随后Q行,每行给出一对被查询的人的编号。
输出格式:
首先在一行中输出这个社区的总人数、以及互不相交的部落的个数。随后对每一次查询,如果他们属于同一个部落,则在一行中输出Y,否则输出N。
输入样例:
4
3 10 1 2
2 3 4
4 1 5 7 8
3 9 6 4
2
10 5
3 7
输出样例:
10 2
Y
N
#include
#include
using namespace std;
unordered_map<int, int> vis;
unordered_map<int, int> parent;
int personNum = 0, circleNum = 0;
int getParent(int n) {
if (parent[n] != n)
parent[n] = getParent(parent[n]);
return parent[n];
}
void unionSet(int x, int y) {
int xParent = getParent(x);
int yParent = getParent(y);
if (xParent != yParent) {
parent[xParent] = yParent;
circleNum--;
}
}
int main() {
int n, nn, cur, last;
cin >> n;
while(n--) {
cin >> nn;
for (int i = 0; i < nn; i++) {
cin >> cur;
if (!vis[cur]) {
parent[cur] = cur;
vis[cur] = 1;
personNum++;
circleNum++;
}
if (i != 0) {
unionSet(last, cur);
}
last = cur;
}
}
cout << personNum << " " << circleNum << endl;
int fn, x, y;
cin >> fn;
while(fn--) {
cin >> x >> y;
if (getParent(x) == getParent(y))
cout << "Y" << endl;
else
cout << "N" << endl;
}
}
分而治之,各个击破是兵家常用的策略之一。在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序,判断每个方案的可行性。
输入格式:
输入在第一行给出两个正整数 N 和 M(均不超过10 000),分别为敌方城市个数(于是默认城市从 1 到 N 编号)和连接两城市的通路条数。随后 M 行,每行给出一条通路所连接的两个城市的编号,其间以一个空格分隔。在城市信息之后给出参谋部的系列方案,即一个正整数 K (≤ 100)和随后的 K 行方案,每行按以下格式给出:
Np v[1] v[2] … v[Np]
其中 Np 是该方案中计划攻下的城市数量,后面的系列 v[i] 是计划攻下的城市编号。
输出格式:
对每一套方案,如果可行就输出YES,否则输出NO。
输入样例:
10 11
8 7
6 8
4 5
8 4
8 1
1 2
1 4
9 8
9 1
1 10
2 4
5
4 10 3 8 4
6 6 1 7 5 4 9
3 1 8 4
2 2 8
7 9 8 7 6 5 4 2
输出样例:
NO
YES
YES
NO
NO
代码参考 : https://blog.csdn.net/weixin_44996854/article/details/103411127
#include
#include
#include
using namespace std;
int main() {
int edge[10010][2];
unordered_map<int, int> myMap;
int v, e, flag, x1, x2, n, nn, t;
cin >> v >> e;
for (int i = 0; i < e; i++) {
cin >> edge[i][0] >> edge[i][1];
}
cin >> n;
for (int i = 0; i < n; i++) {
flag = 1;
myMap.clear();
for (int j = 0; j <e; j++) {
myMap[edge[j][0]] = myMap[edge[j][1]] = 1;
}
cin >> nn;
while (nn--) {
cin >> t;
myMap[t] = 0;
}
for (int j = 0; j < e; j++) {
if (myMap[edge[j][0]] && myMap[edge[j][1]]) {
flag = 0;
break;
}
}
if (flag) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
}
古人云:秀恩爱,分得快。
互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在若干张照片里,他们之间的亲密度就是所有这些同框照片对应的亲密度之和。下面给定一批照片,请你分析一对给定的情侣,看看他们分别有没有亲密度更高的异性朋友?
输入格式:
输入在第一行给出 2 个正整数:N(不超过1000,为总人数——简单起见,我们把所有人从 0 到 N-1 编号。为了区分性别,我们用编号前的负号表示女性)和 M(不超过1000,为照片总数)。随后 M 行,每行给出一张照片的信息,格式如下:
K P[1] … P[K]
其中 K(≤ 500)是该照片中出现的人数,P[1] ~ P[K] 就是这些人的编号。最后一行给出一对异性情侣的编号 A 和 B。同行数字以空格分隔。题目保证每个人只有一个性别,并且不会在同一张照片里出现多次。
输出格式:
首先输出 A PA,其中 PA 是与 A 最亲密的异性。如果 PA 不唯一,则按他们编号的绝对值递增输出;然后类似地输出 B PB。但如果 A 和 B 正是彼此亲密度最高的一对,则只输出他们的编号,无论是否还有其他人并列。
输入样例 1:
10 4
4 -1 2 -3 4
4 2 -3 -5 -6
3 2 4 -5
3 -6 0 2
-3 2
输出样例 1:
-3 2
2 -5
2 -6
输入样例 2:
4 4
4 -1 2 -3 0
2 0 -3
2 2 -3
2 -1 2
-3 2
输出样例 2:
-3 2
此题代码来源: https://blog.csdn.net/weixin_43693379/article/details/89929115
#include
using namespace std;
#define N 1010
struct node
{
int id; //编号
double num; //亲密度
}a[N],b[N]; //分别储存和a,b有关的异性编号以及亲密度
int vis[N]; //记录性别,是女性的话为1,否则为0
int check(int x,int y) //返回x与y是否为异性(若是异性返回1)
{
x=abs(x);y=abs(y);
return vis[x]!=vis[y];
}
void print(int x,int y) //输出x和y的编号
{
if(vis[x])
cout<<"-";
cout<<x<<" ";
if(vis[y])
cout<<"-";
cout<<y<<endl;
}
int swap(string s) //将字符串转化为数字
{
int i=0,ans=0;
if(s[0]=='-')
{
i++;
while(i<s.size())
{
ans=ans*10+s[i]-'0';
i++;
}
vis[ans]=1; //如果是负数(女性),标记一下
return ans;
}
while(i<s.size())
{
ans=ans*10+s[i]-'0';
i++;
}
return ans;
}
int x,y; //分别表示最后输入的一对情侣的编号
vector<int> peo[N]; //存储照片信息,坑死kr,一开始开到505,一直段错误,服了
int main()
{
int n,m,k,tem;
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>k;
for(int j=0;j<k;j++)
{
tem;
string s;
cin>>s;
tem=swap(s);
peo[i].push_back(tem);
}
}
string s;
cin>>s;x=swap(s);
cin>>s;y=swap(s);
for(int i=0;i<n;i++) //初始化
{
a[i].id=i;
b[i].id=i;
}
double maxa=0,maxb=0;
for(int i=0;i<m;i++)
{
k=peo[i].size();
int flag1=0,flag2=0;
for(int j=0;j<k;j++)
{
if(peo[i][j]==x)
flag1=1;
if(peo[i][j]==y)
flag2=1;
}
if(flag1) //如果照片中有x,则遍历照片,更新亲密度
{
for(int j=0;j<k;j++)
{
tem=peo[i][j];
if(tem!=x && check(tem,x))
a[tem].num+=1.0/k*1.0;
}
}
if(flag2) //如果照片中有y,则重复以上操作
{
for(int j=0;j<k;j++)
{
tem=peo[i][j];
if(tem!=y && check(tem,y))
b[tem].num+=1.0/k*1.0;
}
}
}
for(int i=0;i<n;i++) //找出异性中亲密度最高的
{
maxa=max(maxa,a[i].num);
maxb=max(maxb,b[i].num);
}
int flag1=0,flag2=0; //分别记录对方是否是自己亲密度最高的异性
for(int i=0;i<n;i++)
{
if(a[i].id==y && a[i].num==maxa)
flag1=1;
}
for(int i=0;i<n;i++)
if(b[i].id==x && b[i].num==maxb)
flag2=1;
if(flag1 && flag2) //若双方互为亲密度最高,直接输出
{
print(x,y);
return 0;
}
for(int i=0;i<n;i++) //否则按编号从小到大分别输出所有亲密度最高的异性
{
if(a[i].num==maxa)
print(x,a[i].id);
}
for(int i=0;i<n;i++)
{
if(b[i].num==maxb)
print(y,b[i].id);
}
return 0;
}
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。
输入格式:
输入第一行给出3个正整数:N(≤100),即前来参宴的宾客总人数,则这些人从1到N编号;M为已知两两宾客之间的关系数;K为查询的条数。随后M行,每行给出一对宾客之间的关系,格式为:宾客1 宾客2 关系,其中关系为1表示是朋友,-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后K行,每行给出一对需要查询的宾客编号。
这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。
输出格式:
对每个查询输出一行结果:如果两位宾客之间是朋友,且没有敌对关系,则输出No problem;如果他们之间并不是朋友,但也不敌对,则输出OK;如果他们之间有敌对,然而也有共同的朋友,则输出OK but…;如果他们之间只有敌对关系,则输出No way。
输入样例:
7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2
输出样例:
No problem
OK
OK but…
No way
#include
#include
using namespace std;
int a[101][101];
int n,m,k;
//已知c,d是敌人,找共同朋友;有返回1,否则返回0;
int find(int c,int d){
for(int i = 1;i <= n;i++) {
if(a[c][i] && a[d][i])
return 1;//找到共同朋友返回1
}
return 0;//没找到共同朋友 返回0
}
int main(){
vector<string>s;
cin >> n >> m >> k;
//memset(a,0,sizeof(a));
int x, y, z;
//输入关系
for(int i = 0;i < m; i++){
cin >> x >> y >> z;
a[x][y] = z;
a[y][x] = z;
}
//查询关系
for(int i=0;i<k;i++){
cin>>x>>y;
if (a[x][y] == 1) s.push_back("No problem");
else if(a[x][y] == 0) s.push_back("OK");
else if(a[x][y] == -1 && find(x,y))//是敌人但有共同朋友
{
s.push_back("OK but...");
} else { //是敌人并且没有共同朋友
s.push_back("No way");
}
}
//输出
for(int i=0;i<k;i++)
cout<<s[i]<<endl;
return 0;
}
没有人没抢过红包吧…… 这里给出N个人之间互相发红包、抢红包的记录,请你统计一下他们抢红包的收获。
输入格式:
输入第一行给出一个正整数N(≤104 ),即参与发红包和抢红包的总人数,则这些人从1到N编号。随后N行,第i行给出编号为i的人发红包的记录,格式如下:
其中K(0≤K≤20)是发出去的红包个数,Ni 是抢到红包的人的编号,Pi(>0)是其抢到的红包金额(以分为单位)。注意:对于同一个人发出的红包,每人最多只能抢1次,不能重复抢。
输出格式:
按照收入金额从高到低的递减顺序输出每个人的编号和收入金额(以元为单位,输出小数点后2位)。每个人的信息占一行,两数字间有1个空格。如果收入金额有并列,则按抢到红包的个数递减输出;如果还有并列,则按个人编号递增输出。
输入样例:
10
3 2 22 10 58 8 125
5 1 345 3 211 5 233 7 13 8 101
1 7 8800
2 1 1000 2 1000
2 4 250 10 320
6 5 11 9 22 8 33 7 44 10 55 4 2
1 3 8800
2 1 23 2 123
1 8 250
4 2 121 4 516 7 112 9 10
输出样例:
1 11.63
2 3.63
8 3.63
3 2.11
7 1.69
6 -1.67
9 -2.18
10 -3.26
5 -3.26
4 -12.32
#include
#include
#include
#include
using namespace std;
const int maxn = (int)1e4 + 100;
struct nodes {
// 个人编号,收入金额, 收到的红包个数
int id, mon, rNum;
}a[maxn];
static bool cmp(const nodes& a, const nodes& b) {
if (a.mon == b.mon) {
if (a.rNum == b.rNum)
return a.id < b.id;
return a.rNum > b.rNum;
}
return a.mon > b.mon;
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
a[i].id = i;
a[i].rNum = 0;
a[i].mon = 0;
}
int k, x, y;
for (int i = 1; i <= n; i++) {
cin >> k;
for (int j = 0; j < k; j++) {
cin >> x >> y;
a[x].mon += y; // x抢到金额为y的红包
a[x].rNum++; // x抢到的红包数量变多
a[i].mon -= y; // i发出了金额为y的红包
}
}
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++) {
cout << a[i].id << " " << setiosflags(ios::fixed) << setprecision(2) << a[i].mon * 1.0 / 100 << endl;
}
}
或者把cmp写进结构体进行重载
#include
#include
#include
#include
using namespace std;
const int maxn = (int)1e4 + 100;
struct nodes {
// 个人编号,收入金额, 收到的红包个数,
int id, mon, rNum;
bool operator <(const nodes &a)const {
if (mon == a.mon) {
if (rNum == a.rNum)
return id < a.id;
return rNum > a.rNum;
}
return mon > a.mon;
}
}a[maxn];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
a[i].id = i;
a[i].rNum = 0;
a[i].mon = 0;
}
int k, x, y;
for (int i = 1; i <= n; i++) {
cin >> k;
for (int j = 0; j < k; j++) {
cin >> x >> y;
a[x].mon += y; // x抢到金额为y的红包
a[x].rNum++; // x抢到的红包数量变多
a[i].mon -= y; // i发出了金额为y的红包
}
}
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i++) {
cout << a[i].id << " " << setiosflags(ios::fixed) << setprecision(2) << a[i].mon * 1.0 / 100 << endl;
}
}