情人节
以上是朋友圈中一奇葩贴:“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 ...
注解:
其实有一个误区,就是开一个二维数组,用来储存所有的输入的字符串,太笨了,依据题干,我们只需要储存第二个和第十四个字符串就ok,虽然题不难,但是这个解决主要矛盾的思想很重要
代码
#include<bits/stdc++.h>
using namespace std;
string yi, er, a;
int flag1, flag2, res;
int main()
{
while(cin >> a)
{
if(a == ".") break; //注意这里不是'.'而是".";
res ++ ;
if(res == 2 )
{
flag1 = 1;
yi = a;
}
else if(res == 14 )
{
flag2 = 1;
er = a;
}
}
if(flag1 && flag2 ) cout << yi << " and " << er << " are inviting you to dinner..." << endl;
else if(flag1 && !flag2) cout << yi <<" is the only one for you..." << endl;
else cout << "Momo... No one is for you ..." << endl;
return 0;
}
一个小小的注解:c ++ 中的string不可以用printf
输出,只能用cout << "" << endl;
输出
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
解析:暴力的方法
代码:
#include<bits/stdc++.h>
using namespace std;
long long int fz, fm, resfz, resfm;
long long int n;
int main()
{
cin >>n;
for(int i = 0; i < n; i ++ )
{
scanf("%lld/%lld", &fz, &fm);
if(i == 0)
{
resfz = fz;
resfm = fm;
}
else
{
resfz = fm * resfz + fz * resfm;
resfm = resfm * fm;
}
for(long long int i = 2; i <= max(resfm, resfz); i ++ )
{
while (resfz % i == 0 && resfm % i == 0)
{
resfz /= i;
resfm /= i;
}
}
}
long long int z = resfz / resfm;
resfz %= resfm;
for(long long int i = 2; i <= max(resfz, resfm); i ++ )
{
while (resfz % i == 0 && resfm % i == 0)
{
resfz /= i;
resfm /= i;
}
}
if(z && resfz) cout << z << " " << resfz << "/" << resfm << endl;
else if(z && !resfz) cout << z << endl;
else if(!z && resfz) cout << resfz << "/" << resfm << endl;
else if(!z && !resfz) cout << 0 << endl;
return 0;
}
注解:在输入的过程中就夹杂着通分的过程,一边输入,先暴力相加,然后再用for循环暴力约分.
倒数第N个字符串
Problem Description:
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为L
,从 L
个 a
开始,以 1
为步长递增。例如当 L
为 3
时,序列为{ aaa, aab, aac, ..., aaz, aba, abb, ..., abz, ..., zzz }
。这个序列的倒数第27
个字符串就是zyz
。对于任意给定的L
,本题要求你给出对应序列倒数第 N
个字符串。
Input:
输入在一行中给出两个正整数L(2 <= L <= 6)
和N(<= 105)
。
Output:
在一行中输出对应序列倒数第N
个字符串。题目保证这个字符串是存在的。
Sample Input:
3 7417
Sample Output:
pat
解析:
1.输入n位数,那么最后得到的总共的全排列个数为 2 6 n 26^n 26n
2.总共的次序个数已知为m
,要求的倒数第几个也已知,用26^n-m
记为要求的正数第几个次序,这里用x
表示
3.对其x
关于26进行求余数得到的结果加上'a'
就能得到最后一个字母是什么,每次对这个总体次序个数进行削减26,既为下一个位置的字母,以此类推,代码如下:
My solution
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
char a[N];
long long int flag, x, y, l, n, m = 1;
int main()
{
cin >> l >> n;
for(int i = 0; i < l; i ++ )m *= 26;
n = m - n;
flag = l;
while(l -- )
{
x = n % 26;
a[l] = 'a' + x;
n /= 26;
}
for(int i = 0; i < flag; i ++ ) cout << a[i];
}
人以群分
题干:
社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(outgoing,即活跃度高的)和内向型(introverted,即活跃度低的)。
要求两类人群的规模尽可能接近,而他们的总活跃度差距尽可能拉开。
输入格式:
输入第一行给出一个正整数N(2≤N≤105)
。随后一行给出N
个正整数,分别是每个人的活跃度,其间以空格分隔。题目保证这些数字以及它们的和都不会超过2^31
。
输出格式:
按下列格式输出:
Outgoing #: N1
Introverted #: N2
Diff = N3
其中N1
是外向型人的个数;N2
是内向型人的个数;N3
是两群人总活跃度之差的绝对值。
输入样例1:
10
23 8 10 99 46 2333 46 1 666 555
输出样例1:
Outgoing #: 5
Introverted #: 5
Diff = 3611
思路:取中间值mid
作为分界线,左半部分为内向者,右半部分为外向者由于数据量大,所以用冒泡会有有两个测试点超时,用sort(a, a + n)
函数处理即可
My Solution
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
int sum1, sum2, mid, ans, r;
int main()
{
cin >> n;
for(int i = 0; i < n; i ++ ) cin >> a[i];
sort(a, a + n);
mid = n / 2;
r = n - mid;
for(int i = 0; i < mid; i ++ )
{
sum1 += a[i];
}
for(int i = mid; i < n; i ++)
{
sum2 += a[i];
}
ans = sum2 - sum1;
cout << "Outgoing #: " << r << endl;
cout << "Introverted #: " << mid << endl;
cout << "Diff = " << ans << endl;
}