Table of Contents
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
题目大意: