湖南文理学院第十六届程序设计竞赛_题解

我是比赛链接

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 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值