2019.2.11rating 题解
Table of Contents
A – キャンディーと2人の子供/ Fighting over Candies
题意:将三份糖果分给两个人,要求两个人分到的糖果数相等
题解:
法1:排序后解答
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[3];
for(int i=0; i<3; i++){
cin>>a[i];
}
sort(a,a+3);
a[0]+a[1]==a[2]?cout<<"Yes"<<endl:cout<<"No"<<endl;
return 0;
}
法二:直接写出三种可能
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int a,b,c;
cin>>a>>b>>c;
if(a+b==c||a+c==b||b+c==a){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
return 0;
}
B – すぬけ君の涂り絵2 イージー/ Snuke’s Coloring 2 (ABC Edit)
题意:在坐标轴上取一点 (w , h ),以 y轴 和 x轴 各为一条边,得一个矩形,输入n个点图色(题目有对这n个点分别有四种要求,即用a进行判断选择)
题解:max,min函数的运用,s和t是原点坐标,通过判断点的位置,判断涂色位置
max与min的作用如其意思返回两个之中的最大值
#include <bits/stdc++.h>
using namespace std;
int main() {
int W, H, N;
cin >> W >> H >> N;
int s = 0, t = 0;//坐标原点
for (int i = 0; i < N; i++) {
int x, y, a;
cin >> x >> y >> a;
if (a == 1) s = max(s, x);
if (a == 2) W = min(W, x);
if (a == 3) t = max(t, y);
if (a == 4) H = min(H, y);
}
if (W <= s || H <= t) cout << 0 << endl;
else cout << (W - s) * (H - t) << endl;
}
C – 一维反转/ 1D反转
题意:一维的黑白棋,可以将B和W分别看作黑棋和白棋
例子:
BWBBWB
下最左或者最右是一样的
WBWBBWB(加粗为下的,划线为改变的棋子
就变成 WWWBBWB
如果在最左下B
就会变成BBBBBBWB
解题思路:判断前后紧邻的棋子是否相同
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
string s;
cin>>s;
if(s.find('W')==-1||s.find('B')==-1){
cout<<"0"<<endl;
}//这是只存在单一棋子的情况
else{
int cnt=0;
for(int i=0; i<s.size()-1; i++){
if(s[i]!=s[i+1])
cnt++;//如果前后不同就要下一个棋子使其相同,故步数加一
}
cout<<cnt<<endl;
}
return 0;
}
E – AtCoder ***比赛
题意:输出三个单词的手字母
解题思路:空格符是字符串输入的结束符所以就变得很简单
string如果没有用万能函数库的话就要加头文件#include<string>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
string a,b,c;
cin>>a>>b>>c;
cout<<a[0]<<b[0]<<c[0]<<endl;
return 0;
}
F – 在a和b之间……
题意:(题意很直接了) 给出非负整数a和b(a≤b)和正整数 x。在 a和 b之间的整数(包括两者)中,有多少可被 x整除?
解题思路:
1.用循环计数,看到样本输入四我就放弃这种思路了,估计会超时,
特意写了一个,没提交试试,应该是错的,毕竟这么大
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll a,b,x;
cin>>a>>b>>x;
ll cnt=0;
for(int i=a; i<=b; i++){
i%x==0?cnt++:cnt=cnt;
}
cout<<cnt;
return 0;
}
2.在做到数据大的题目就要先考虑如何在过程中减小数据的大小
b以内能被x整除以及a-1内能被x整除的数字相减便是之间的,a是否为0分类讨论一下,记住a和b都要ll,就在这wa了一次
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);//加速操作,怕题目在时间上有要求
ll a,b,x;
cin>>a>>b>>x;
a!=0?cout << b / x - (a - 1) / x << endl:cout << b / x + 1 << endl;
return 0;
}
G – 盒子和糖果
题意:输入n以及x,然后再输入n个盒子中的糖果数
多次执行以下操作:
- 选择一个至少包含一个糖果的盒子,然后在所选盒子中吃一个糖果。
他的目标如下:
- 任何两个相邻的盒子总共最多包含x个糖果
题解:糖果数差值即为需要进行的步数(一种是与最大值的差值一种是与左右的差值)
有两种想法
法一是数组,for循环里面进行判断max(a[i],a[i+1])和max(a[i-1],a[i])然后再进行步骤计算
法二是每一步进行判断,如下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 1000001
int main()
{
int n,x;
cin>>n>>x;
ll a,b,cnt=0;//记录操作步数
cin>>a;//开头第一盒糖果
if(a>x){
cnt+=a-x;
a=x;
}
for(int i=1;i<n;i++)
{
cin>>b;
if((a+b)>x)
{
cnt+=a+b-x;
a=x-a;
}
else {
a=b;
}
}
cout<<cnt<<endl;
return 0;
}
H – 普通游戏
题意:
题解: 遍历字符串s的每一个,左右字符相等的话就看下一个字符,不等的话就删除这一个字符,然后接下一个人。如果遍历没有可以删除的字符的话或者字符串长度小于3,就说明这个人输了