第一周学习记录

主要记录一下这周周赛的题目:

U497330 强强联手

题目描述
FZ158在 zyz 的指导下,即将举行男女混双的乒乓球比赛了,FZ158要派出最强的队伍参加,我们假设男女组合战斗力值为男战斗力加上女战斗力的和,现在需要挑选组合战斗力最强的一对男女参赛。

给你FZ158所有男生和女生的乒乓球战斗力列表,请计算最大的组合战斗力。

输入格式
第一行输入两个整数 n,m,表示男生数量和女生数量。

第二行输入 n 个整数 ai,表示所有男生的战斗力值。

第三行输入 m 个整数 bi,表示所有女生的战斗力值。

输出格式
输出一个整数,代表最大组合战斗力。

输入输出样例
输入 #1
2 3
1 2
1 2 3
输出 #1
5
说明/提示
【数据范围】
对于 50%的数据,n,m≤5000
对于 100%的数据,n,m≤1e6,ai,bi≤1e9

唔……这道题在做的时候直接套了两个for循环/……然后它就超时了/……

在善良的石宇学长的提醒下,发现它其实可以先把男女两队的最大值分别找到,然后再相加即可

#include <iostream>
#include <algorithm>

using namespace std;

const int N=1e6+10;
int a[N],b[N];
 
int main()
{
	int n,m,max1,max2;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	max1=a[1];
	max2=b[1];
	for(int i=1;i<=n;i++){	
		if(max1<a[i]){
			max1=a[i];
		}
	}
	for(int i=1;i<=m;i++){
		if(max2<b[i]){
			max2=b[i];
		}
	}
	cout<<max1+max2;
	return 0;
 }

U496207 石头剪刀布

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题思路(还是来自善良的石宇学长QAQ):

  • 先输入需要输入的数据
  • 然后通过循环将两个人每次的动作所对应的数值保存到两个数组里
  • 在数组里循环比较
#include <iostream>
#include <algorithm>
 using namespace std;
 
 const int N=5e5+10;
 int a[N],b[N];
 int ca=0,cb=0;
 
 int main()
 {
 	int n,na,nb;
 	cin>>n>>na>>nb;
 	for(int i=0;i<na;i++){
 		cin>>a[i];
 		int t=1;
 		while(i+t*na<=n){
 			a[i+t*na]=a[i];
 			t++;
		}
	}
	for(int i=0;i<nb;i++){
 		cin>>b[i];
 		int t=1;
 		while(i+t*nb<=n){
 			b[i+t*nb]=b[i];
 			t++;
		}
	}
	for(int i=0;i<n;i++)
    {
        if(a[i]==b[i]);
        if(a[i]==0 && (b[i]==2 || b[i]==3)) ca++;
        if(b[i]==0 && (a[i]==2 || a[i]==3)) cb++;
        if(a[i]==1 && (b[i]==0 || b[i]==3)) ca++;
        if(b[i]==1 && (a[i]==0 || a[i]==3)) cb++;
        if(a[i]==2 && (b[i]==1 || b[i]==4)) ca++;
        if(b[i]==2 && (a[i]==1 || a[i]==4)) cb++;
        if(a[i]==3 && (b[i]==2 || b[i]==4)) ca++;
        if(b[i]==3 && (a[i]==2 || a[i]==4)) cb++;
        if(a[i]==4 && (b[i]==0 || b[i]==1)) ca++;
        if(b[i]==4 && (a[i]==0 || a[i]==1)) cb++;
    }
    cout<<ca<<" "<<cb;
	
	return 0;
 }

U497329 Cirno打怪

在这里插入图片描述

在这里插入图片描述
周赛的时候没有注意输入格式并且把j++写成了j–;QAQ

#include<stdio.h>

int main()
{
	long long n,m;
	char a[1002][1002];
	long long p=0,q=0,num=0;
	scanf("%lld %lld",&n,&m);
	for(long long i=1;i<=n;i++){
		for(long long j=1;j<=m;j++){
			scanf(" %c",&a[i][j]);
			if(a[i][j]=='W'||a[i][j]=='S'||a[i][j]=='A'||a[i][j]=='D'){
				p=i;
				q=j;
				printf("$1");
			}
		}
	}
	printf("$%d %d",p,q);
	if(a[p][q]=='W'){
		for(long long i=p;i>=1;i--){
			if(a[i][q]=='*'){
				num++;
			}
		}
	}
	if(a[p][q]=='S'){
		for(long long i=p;i<=n;i++){
			if(a[i][q]=='*'){
				num++;
			}
		}
	}
	if(a[p][q]=='A'){
		for(long long j=q;j>=1;j--){
			if(a[p][j]=='*'){
				num++;
			}
		}
	}
	if(a[p][q]=='D'){
		for(long long j=q;j<=m;j++){
			if(a[p][j]=='*'){
				num++;
			}
		}
	}
	printf("%lld",num);
	return 0;
}

U495104 格雷码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

const int N=2e5+10;
char arr[N],brr[N];
void zhuangelei(char *arr){
	int m,n,len=0;
	while(arr[len]!='\0')
		len++;
	brr[0]=arr[0];
	for(int i=1;i<=len-1;i++){
		m=arr[i-1]-48;
		n=arr[i]-48;
		brr[i]=(m+n)%2+48;
	}
	cout<<brr<<"\n";
}
void zhuanerjinzhi(char *arr){
	int m,n,len=0;
	while(arr[len]!='\0') 
		len++;	
	brr[0]=arr[0];
	for(int i=1;i<=len-1;i++){
		m=brr[i-1]-48;
		n=arr[i]-48;
		brr[i]=(m+n)%2+48;
	}
	cout<<brr<<"\n";
}
int main()
{
	int n,b;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>arr>>b;
		if(b==1)	zhuangelei(arr);
		if(b==-1)	zhuanerjinzhi(arr);
	}
	return 0;
} 

善良的石宇学长告诉我其实计算字符串长度可以直接用strlen QAQ;
但是这回写都写了,下回用嘿嘿:)

U495158 Cirno与概率论

题目描述
Cirno 正在学概率论!

现有一个随机变量 X 有 n 个不同的整数取值,变量 X 的第 i 个取值为 xi,概率为 p i(即变量 X 取 x i的概率为 p i)。

Cirno 又给你 q 组询问,每组询问给定整数 a,b,请你求出P(a≤X≤b) 的值,结果保留六位小数。

输入格式
第一行一个整数 n,代表随机变量 X 有多少个不同的取值。

接下来 n 行,每行有一个整数 xi 和一个小数pi,代表着随机变量的取值及其对应的概率。

接下来一行有一个整数 q ,代表询问次数。

接下来 q 行,每行有两个整数 a,b作为询问中的两个参数。

输出格式
输出共有 q 行,每行一个六位小数 ,代表每次询问的结果。

输入输出样例
输入 #1
3
-1 0.3
0 0.4
2 0.3
4
-3 -1
-1 0
1 3
3 4
输出 #1
0.300000
0.700000
0.300000
0.000000
在这里插入图片描述
在这里插入图片描述
原本又是想要套一堆循环/……,依然是善良的石宇学长告诉我这道题的正解其实是前缀和(天,前俩周才学会的竟然没看出来QAQ)

#include <iostream>
#include <algorithm>

using namespace std;

const int N=2e6+10;
const int M=1e6;
double a[N],s[N];
 
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		a[x+M]=y;
	}
	a[0]=s[0];
	for(int i=1;i<=n;i++){
		s[i]=s[i-1]+a[i];
	}
	int q;
	cin>>q;
	for(int i=1;i<=q;i++){
		int a,b;
		cin>>a>>b;
		double answer=s[b]-s[a-1];
		printf("%.6lf",answer);
	}
	return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值