2019.2.11rating 题解

A – キャンディーと2人の子供/ Fighting over Candies

链接:a题

题意:将三份糖果分给两个人,要求两个人分到的糖果数相等

题解:

法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)

AtCoder – 2145 

链接:b题

题意:在坐标轴上取一点 (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反转

c题:链接

题意:一维的黑白棋,可以将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 ***比赛

链接:E题

题意:输出三个单词的手字母

解题思路:空格符是字符串输入的结束符所以就变得很简单

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之间……

链接:F题

题意:(题意很直接了) 给出非负整数abab)和正整数 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 – 盒子和糖果

链接: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 – 普通游戏

链接:H题

题意:

题解:  遍历字符串s的每一个,左右字符相等的话就看下一个字符,不等的话就删除这一个字符,然后接下一个人。如果遍历没有可以删除的字符的话或者字符串长度小于3,就说明这个人输了

posted @ 2019-02-12 06:04  月光不染是非  阅读(137)  评论(0编辑  收藏  举报