A. Filling Diamonds
通过对图像的观察,我们不难发现,答案就是正立的菱形的个数
为什么是这样,我们无论如何放置都有一个图形是要用,正立的菱形去填涂的,我们假定可以有两个正立的菱形存在,可以发现,无论这两个菱形的距离是如何,都不可能填满这两个菱形之前的区域,因此只可能存在一个正立的菱形,所以正立的菱形的位置就决定了方案的数量。
//Powered by CK
#include<bits/stdc++.h>
using namespace std;
int main() {
//freopen("in.txt", "r", stdin);
int t, n;
cin >> t;
while(t--) {
cin >> n;
cout << n << endl;
}
return 0;
}
B. Sorted Adjacent Differences
B. Sorted Adjacent Differences 题目链接
简单的贪心,排一个序,从中间开始同时向两边,或者从两边开始向中间开始输出。
//Powered by CK
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N], n;
int main() {
// freopen("in.txt", "r", stdin);
int t;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, a + n);
int l = n / 2 - 1, r = n / 2;
if(n & 1) printf("%d ", a[r++]);//奇数情况特殊处理一下,方便后面的枚举遍历。
while(r < n)
printf("%d %d ",a[l--], a[r++]);
printf("
");
}
return 0;
}
C. Powered Addition
要求是形成一个非递减的序列,遍历一遍记录一个当前的最大值 most 就好了,通过对小于most的数,更新最大差值。
//Powered by CK
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N], n;
int main() {
// freopen("in.txt", "r", stdin);
int t;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
int most = a[0], ans = 0;
for(int i = 1; i < n; i++) {
if(a[i] >= most) most = a[i];
else {
ans = max(most - a[i], ans);
a[i] = most;
}
}
int pos = 0, po = 1;
while(ans > 0) {
ans -= po;
po *= 2;
pos++;
}
printf("%d
", pos);
}
return 0;
}
D题写的时候就感觉是树形dp,dp还没有系统的学过(基本没子写过dp的题目),不会写,先暂时放下吧。
昨天忘记比赛时间了,比赛开赛后半小时才去写,排名2500+去了。