A.小红大战小紫
题目描述
小红正在和小紫对战,给定两个人的胜场数量,请你判断最终是谁获胜了。
输入描述:
两个正整数a,b,用空格隔开。a代表小红的胜场,b代表小紫的胜场。
输出描述:
如果小红获胜了,请输出"kou"。如果小紫获胜了,请输出"yukari"。如果最终平局,请输出"draw"。
思路:
签到题
代码:
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ll long long
#define int long long
#define endl "\n"
using namespace std;
signed main()
{
IOS;
int a, b;
cin >> a >> b;
if (a > b) {
cout << "kou" << endl;
}
else if(a<b){
cout << "yukari" << endl;
}
else {
cout << "draw" << endl;
}
return 0;
}
B.小红的白日梦
题目描述
小红经常会做梦,但她比较喜欢做白日梦。
已知小红白天做梦可以获得 2 点幸福度,晚上做梦可以获得 1 点幸福度。现在给定小红每天中午和晚上睡觉的做梦情况。她可以每天将晚上的梦提前移到白天来做,请问小红总共最多可以获得多少幸福度?
注:只有当白天没做梦且晚上做梦的时候才可以移动梦境。
输入描述:
第一行输入一个正整数n,代表总天数。 第二行输入一个长度为n的、仅由'Y'和'N'组成字符串,代表每天中午的做梦情况。 第二行输入一个长度为n的、仅由'Y'和'N'组成字符串,代表每天晚上的做梦情况。 'Y'代表做梦了,'N'代表没做梦。
输出描述:
一个整数,代表最多的幸福度。
思路:
签到题
代码:
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ll long long
#define int long long
#define endl "\n"
using namespace std;
signed main()
{
IOS;
int n;
cin >> n;
string z, w;
cin >> z >> w;
int ans = 0;
for (int i = 0; i < n; i++) {
if (z[i] == 'N' && w[i] == 'Y') {
ans += 2;
}
else if (z[i] == 'Y' && w[i] == 'Y') {
ans += 3;
}
else if (z[i] == 'Y' && w[i] == 'N') {
ans += 2;
}
}
cout << ans << endl;
return 0;
}
C.小红的小小红
题目描述
小红拿到了一个字符串,其中一定包含连续子串"xiao",和连续子串"hong"。
请你将字符串重排,使得该字符串包含"xiaohong"的连续子串。
输入描述:
输入一个仅包含小写字母的字符串,长度不超过10510^5105 保证字符串一定包含"xiao"子串和"hong"子串。
输出描述:
重排后的字符串。有多解时输出任意即可。
思路:
先把xiaohong扔在答案最前面,然后把剩下的字符串拼在答案后面即可
代码:
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ll long long
#define int long long
#define endl "\n"
using namespace std;
signed main()
{
IOS;
string s;
cin >> s;
s.replace(s.find("xiao"),4,"");
s.replace(s.find("hong"),4,"");
cout << "xiaohong" + s << endl;
return 0;
}
D.小红的中位数
题目描述
小红拿到了一个数组:a1,a2,...,an。她定义 f(i) 为,删除第i个元素后,数组的中位数。现在小红想让你求出f(1),f(2)...f(n)的值,你能帮帮她吗?
输入描述:
第一行输入一个正整数n,代表数组的大小。 第二行输入n个正整数ai,代表数组的元素。
输出描述:
输出n行,每行输出一个浮点数,第i行代表f(i)的值。保留一位小数。
思路:
动态中位数问题。分为两种情况,原数组元素个数为偶数时,删除第i个元素后剩余元素个数为奇数,中位数为剩余数组排序后最中央的数;原数组元素个数为偶数时,删除第i个元素后剩余元素个数为偶数,中位数为剩余数组排序后最中央的两个数之和
当原数组元素个数为偶数时,删除n/2之后的位置对原数组无影响,删除n/2之前的位置会造成中位数后移一位;当原数组元素个数为奇数时,删掉n+1/2以后的位置造成数组前移,反之后移
代码:
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ll long long
#define int long long
#define endl "\n"
using namespace std;
int n;
const int N = 100010;
double a[N];
int pre[N];//用于记录原数组下标和排序后数组下标之间的关系,值为排序后数组的下标
pair<double, int> p[N];
bool cmp(pair<double, int> a, pair<double, int> b) {//根据first从小到大排序
return a.first < b.first;
}
void solve()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
p[i] = { a[i],i };
}
sort(p + 1, p + n + 1, cmp);
for (int i = 1; i <= n; i++) {
int tag = p[i].second;//排序后的数组的第i个元素在原数组中的下标
pre[tag] = i;
}
//当原数组元素个数为偶数时,删除n/2之后的位置对原数组无影响,删除n/2之前的位置会造成中位数后移一位
if (n % 2 == 0) {
for (int i = 1; i <= n; i++) {
if (pre[i] > n / 2) {
printf("%.1lf\n", p[n / 2].first);
}
else {
printf("%.1lf\n", p[n / 2 + 1].first);
}
}
}
//当原数组元素个数为奇数时,删掉n+1/2以后的位置造成数组前移,反之后移
else {
for (int i = 1; i <= n; i++) {
if (pre[i] < (n + 1) / 2) {//后移
printf("%.1lf\n", (p[(n + 1) / 2].first + p[(n + 1) / 2 + 1].first) / 2.0);
}
else if (pre[i] == (n + 1) / 2) {//删除的是原数组中的中位数,则输出原中位数前后的数的平均数
printf("%.1lf\n", (p[(n) / 2].first + p[(n + 1) / 2 + 1].first) / 2.0);
}
else {//前移
printf("%.1lf\n", (p[(n) / 2].first + p[(n + 1) / 2].first) / 2.0);
}
}
}
}
signed main()
{
solve();
return 0;
}