ZUST 集训队19菜鸡互啄-7 题解

本文介绍了几个算法题目,包括王朝最长字符串的动态规划解法,反叛者与政府活动的策略分析,电影院座位安排的优化问题,以及图像处理中的比例调整和最短路径计算等。通过这些题目,展示了如何运用不同的算法思维解决实际问题。
摘要由CSDN通过智能技术生成

A-Dynasty Puzzles
题目意思说:有一个王朝,他们国王的名字用姓氏的简写来标记每一代。为了保证王朝的稳定,现在这个王朝的继承人的名字需要满足继承者名字的第一个字母要和前代名字最后一个字母相同。然后拼接起来的名字,第一个字母和最后一个字母相同。现在有一个考古博士,知道了这个王朝国王和亲戚的名字。问你这个王朝所能够得到的最长字符串。
设DP[i][j]表示字符串的首字母是i,尾字母是j。dp[j][v]=max(dp[j][v],dp[j][u]+len)(此时字符串a的首字母是u,尾字母是v)当前表示之前的串(j,u)加上了当前串(u,v)的长度是否大于(j,v)串的长度,如果大于,更新状态

#include<bits/stdc++.h>
using namespace std;
int dp[30][30]; 
int main()
{
   
    int n;
    string s;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
   
        cin>>s;
        int st=s[0]-'a';
        int ed=s[s.size()-1]-'a';
        int len=s.size();
        for(int j=0;j<26;j++)
        {
   
            if(dp[j][st])dp[j][ed]=max(dp[j][ed],dp[j][st]+len);
        }
        dp[st][ed]=max(len,dp[st][ed]);
    }
    int ans=0;
    for(int i=0;i<26;i++)
    {
   
        ans=max(ans,dp[i][i]);
    }
    cout<<ans<<endl;
    return 0;
}

B-Demonstration
题目题意:题目给了我们n个广场,反叛者的活动天数K,政府的总经济b,给了我们n个广场每次租用的花费(其中广场的下标是距离中心城区的远近,下标越小越近),我们需要输出的是反叛者可以租到的距离中心最近的广场的下标。每一天的活动如下:反叛者可以租用一个没有被政府使用过的广场。政府为了避免反叛者租到距离中心近的广场,会花钱使用它(干别的),这样政府就有借口不借了,但是如果反叛军租用最后一个(当然是最差的),政府不会花钱使用它的。政府如果没有钱使用它,那么反叛军就租用成功了,(当然反叛军也可以不使用它,只要他们还有时间)我们把前面n-1个广场排个序,费用高的在前面,然后累加前面k-1个广场,然后再遍历一遍n个广场。
首先我们可以想到的是,为了在k天内选到最靠前的城市,我们要想办法在前k-1天挑选尽可能贵的城市,为第k天奠定基础。
先对前n-1个城市的举办活动价值排序,对前k-1大的求和得到sum,接下来:
<1>sum>=0,则不论前k-1天选择多么贵的城市,第k天都无法找到一个城市花光政府的钱,那么只能选择最差的城市
<2>sum<0,按序号由小到大判断该城市是否包含在sum中或者将sum的第一项替换为该城市后sum仍小于0,如果满足条件,则该城市则为最优解

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long int ll;
int a[maxn],b[maxn];
ll sum;
bool cnm(int a,int b){
   return a>b;}
int main()
{
   
    int n,k;
    ll t;
    cin>>n>>k>>t;
    for(int i=1;i<=n;i++){
   cin>>a[i];b[i]=a[i];}
    sort(b+1,b+n,cnm);
    for(int i=1;i<k;i++)sum+=b[i];
    for(int i=1;i<n;i++)
    {
   
        if(a[i]>b[k])
        {
   
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值