主要记录一下这周周赛的题目:
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;
}