2019.9.21个人赛

Stat # Origin Title
Solved 26 / 36 A AtCoder 4822 Alchemist
Solved 21 / 54 B AtCoder 4894 Build Stairs
Solved 26 / 28 C AtCoder 4858 One Clue
Solved 9 / 28 D AtCoder 4862 Green Bin
Solved 27 / 31 E AtCoder 4887 Red or Not
Solved 18 / 36 F AtCoder 4891 City Savers
Solved 19 / 37 G AtCoder 4873 ModSum
3 / 9 H AtCoder 4877 Summer Vacation

A – Alchemist

题目大意:

对n堆成分进行处理,每两堆混合后只会剩下两堆质量的1/2,混合后的质量再与其他堆进行混合,求解怎么混合使得剩下的质量是最多,求最多剩余质量

解题思路:

通过样例很清楚质量越多越排后进行混合处理,那么就可以使得最后剩余的质量最多,简单排序模拟即可

通过代码:

#include <bits/stdc++.h>
#define REP(i, a, b) for(int i = a; i < b; i++)
#define REP_(i, a, b) for(int i = a; i <= b; i++)
#define sl(n) scanf("%lld", &n);
#define si(n) scanf("%d", &n);
#define RepAll(a) for(auto x: a)
#define cout(ans) cout << ans << endl;
typedef long long ll;
double a[10010];
using namespace std;
int main(){
    int n;
    cin >> n;

    REP(i, 0, n){
        cin >> a[i];
    }
    sort(a, a+n);
    double sum = 0;
    REP(i, 1, n){
        a[i] = (double)(a[i-1] + a[i])/2;
    }
    //cout << a[n - 1] << '
';
    printf("%.5f
", a[n - 1]);
}

B – Build Stairs

题目大意

有n个正方形,且已知高度,对于每个正方形,您将执行一次以下任一操作:

  • 将正方形的高度减少1
  • 没做什么。

如果可以执行使正方形的高度从左到右不减小的操作,请打印Yes;否则,打印No

解题思路:

每次输入的时候判断一下就好了,,一旦输入的高度本来就小于上一回的高度的话,那么直接输出“No”就好了

解题代码:

#include <bits/stdc++.h>
#define REP(i, a, b) for(int i = a; i < b; i++)
#define REP_(i, a, b) for(int i = a; i <= b; i++)
#define sl(n) scanf("%lld", &n);
#define si(n) scanf("%d", &n);
#define RepAll(a) for(auto x: a)
#define cout(ans) cout << ans << endl;
typedef long long ll;

using namespace std;
int main()
{

    int n, h, m=0;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> h;
        if(h<m)
        {
            cout<<"No";
            return 0;
        }
        m=max(m,h-1);
    }
    cout<<"Yes";
}

C – One Clue

题目大意:

给石头涂色

解题思路:

注意数据范围和例子即可,所涂的石头可能在三个位置,所以不妨从最右考虑起,先输出最左边的

解题代码

#include <bits/stdc++.h>
#define REP(i, a, b) for(int i = a; i < b; i++)
#define REP_(i, a, b) for(int i = a; i <= b; i++)
#define sl(n) scanf("%lld", &n);
#define si(n) scanf("%d", &n);
#define RepAll(a) for(auto x: a)
#define cout(ans) cout << ans << endl;
typedef long long ll;

using namespace std;
int main(){
	int k,x;
	cin >> k >> x;
	for(int i=x-k+1;i<=x+k-1;i++)
        cout<<i<<endl;
}

D – Green Bin

题目大意:

给你n个字符串,判断这n个字符串能配成几对字谜,当字符串中字母出现的个数以及出现的字母相同时即互为字谜

解题思路:

当你排序之后,按字典序互为字谜的字符串是一定相同的,那么在用map存一下出现个数即可,后自增保证每次增加的是对数(如果用for循环比较的话会答案错误,因为只能算出相同字符串而不能直接得到对数,所以用map显然更加合适)

解题代码:

#include <bits/stdc++.h>
#define REP(i, a, b) for(int i = a; i < b; i++)
#define REP_(i, a, b) for(int i = a; i <= b; i++)
#define sl(n) scanf("%lld", &n);
#define si(n) scanf("%d", &n);
#define RepAll(a) for(auto x: a)
#define cout(ans) cout << ans << endl;
typedef long long ll;
using namespace std;
map <string,int> m;
string s;
long long ans=0;
using namespace std;
int main()
{
    int n;
    cin >> n;
    while ( n--)
    {
        cin >> s;
        sort(s.begin(), s.end());
        //cout << m[s];
        ans += m[s]++;
    }
    cout << ans;
}

E – Red or Not

题目大意:

原文地址:https://www.cnblogs.com/ygbrsf/p/12583003.html