牛客周赛29

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;
}

EF后续更新喵

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JalenG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值