A(AtCoder):平方不等式
思路(huas_wlq):
直接判断输出
#include <bits/stdc++.h> /// 万能头文件(囊括了绝大多数的头文件,无需再定义每一个头文件)
using namespace std;
int main(){
int a, b, c;
cin >> a >> b >> c;
if(a * a + b * b < c * c) cout << "Yes";
else cout << "No";
return 0;
}
B(huas_wlq):阅读理解
思路1(huas_wlq):
将数字当字符串处理,统一读入反向输出。
#include <bits/stdc++.h>
using namespace std;
string s;
int main(){
cin >> s;
for(int i = s.length() - 1; ~i; i --) {
cout << s[i];
}
return 0;
}
思路2(huas_wlq):
通过除、模运算,每次取得数字最后一位输出。
#include <bits/stdc++.h>
using namespace std;
#define ll long long /// 宏定义
int main() {
ll x;
cin >> x;
while(x) {
/// x 没有前导零
cout << x % 10; /// 取得最后一位数
x /= 10; /// 删除最后一位数
}
return 0;
}
C(huas_wlq):阴阳合同
知识点:
1776 神奇的数组 姐妹篇,基础dp + 思维,关于基础dp 部分请看这篇 题解。
思路(huas_wlq):
考虑数组每个位置的意义,对于dp数组 dp[ i ][ 1] 其意义为“前 i 个数在第 i 个数被选取的时候所能获得的最大值(若数组第二维是 0 则代表的是不选时的最大值),而本题中我们需要考虑中间的每一个数其必须被选取或者必须不被选取时的最大值。
对于一个特殊的指定位置,我们假设其为第 x 位,且其是一定要被选取的,那么其最大值就是 其被选取 且其左右两个位置 不被选取的最大值 的和故有 ans = a[ x ] + dp1[ x - 1 ][ 0 ] + dp2[ x + 1 ][ 0 ] (其中 a[ x ] 代表第 x 个物品的价值 ,而 dp1 数组 代表从前往后求得的当前位置选于不选的最大值, dp2 数组 则是从后往前求得的当前位置选于不选的最大值)。
同理在 x 必定不被选取时有:ans = a[ x ] + dp1[ x ][ 0 ] + dp2[ x ][ 0 ] 。
勘误(21.05.17)(指正:王磊):当 x 在不被选取的时候我们需要左右都求一下是选取的值大还是不被选取的值大,这与我们 dp[ i ][ 0 ] 的求法其实是一样的,所以直接求出当前值不选的从前往后最大值和从后往前最大值即可(利用从前往后和从后往前的两次 dp 求出对应位置前段和后的值之后相加即可)。
#include <bits/stdc++.h>
using namespace std;
const int N = 100009; /// 定义数组长度
int n, a[N], m;
int b[N][2], c[N][2];
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i ++) scanf("%d", a + i);
for(int i = 1; i <= n; i ++) {
/// dp1
b[i][0] = max(b[i - 1][0], b[i - 1][1]);
b[i][1] = b[i - 1][0] + a[i];
}
for(int i = n; i; i