581A链接:点击打开链接
给你a只红袜子,b只蓝袜子,问你可以组成多少对颜色不同的袜子以及剩下多少对单色袜子。
小小的脑洞,答案分别为a, b最小值以及a - b绝对值的一半。
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
int a, b;
int main(int argc, char const *argv[])
{
scanf("%d%d", &a, &b);
printf("%d %d\n", min(a, b), abs(a - b) / 2);
return 0;
}
581B链接:点击打开链接
给你n,接下来一行n个数字代表第i个房子的楼层数量,问你房子加多少楼层才能使得每个房子均为luxurious。房子为luxurious当此
房子比右边任意房子楼层数量都多。
脑洞题目,因为是要求每个房子均为luxurious,所以应从右边遍历,不断更新房子楼层数才能使得所有房子均为luxurious。采用两
个数组,一个记录原楼层信息,一个记录当前房子右边所有房子楼层数量的最大值与当前房子楼层数量的关系。最后比较即可。
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 1e5 + 5;
int n, m = -1, a[MAXN], ans[MAXN];
int main(int argc, char const *argv[])
{
scanf("%d", &n);
for(int i = 0; i < n; ++i)
scanf("%d", &a[i]);
for(int i = n - 1; i >= 0; --i) {
if(a[i] > m) ans[i] = a[i];
else if(a[i] == m) ans[i] = -1;
else ans[i] = m;
m = max(m, a[i]);
}
for(int i = 0; i < n - 1; ++i)
if(ans[i] == a[i]) printf("0 ");
else if(ans[i] == -1) printf("1 ");
else printf("%d ", ans[i] - a[i] + 1);
printf("0\n");
return 0;
}
581C链接:点击打开链接
给你n, k,接下来一行n个数字代表n个skill,skill值不会超过100,现在你有k个技能点,问你将技能点加到skill以后skill / 10总合的最
大值。
脑洞题目,读入数据后首先排序,余数越大的越靠前,这样分配技能点的时候花费技能点少。分配技能点之后算出skill还差多少到最
大值100或是超过100多少,如果k不够这个总和,那么就算出k可以增加多少个10,sum + ans / 10即为所求答案。
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 1e5 + 5;
int n, k, ans, sum, a[MAXN];
bool cmp(int a, int b)
{
return a % 10 > b % 10;
}
int main(int argc, char const *argv[])
{
scanf("%d%d", &n, &k);
for(int i = 0; i < n; ++i)
scanf("%d", &a[i]);
sort(a, a + n, cmp);
for(int i = 0; i < n; ++i) {
int tmp = 10 - a[i] % 10;
if(tmp <= k) {
k -= tmp;
a[i] += tmp;
}
else break;
}
for(int i = 0; i < n; ++i) {
int tmp = 100 - a[i];
ans += tmp;
}
if(ans > k) ans = k - k % 10;
for(int i = 0; i < n; ++i)
sum += a[i] / 10;
printf("%d\n", sum + ans / 10);
return 0;
}