首页 > 其他分享 >Hello 2022(B,D)

Hello 2022(B,D)

时间:2023-01-01 18:22:40浏览次数:50  
标签:端点 min int 到达 一个 maxn 2022 Hello

Hello 2022(B,D)

B

B

这一个题我知道是找到一个或者是一个区间,他们的端点中一定存在最左端点和最右端点,每一个段都有一个价值,而选择一个段,就会获得该段的价值,求最小价值(我是这样的理解)

一开始我真的在纠结要在获得的新的一个端点和上一个边界一样要怎么更新(我想到了万一上一个的两端是聚集在一个区间的,而且比选这一个区间的价值要小,那么我可以选择不更新,万一下一个又和这一个在一起的价值更小,可是上一步我还没有更新,所以下一步就得不到最好的答案,想没有想清楚,真是烦)

然后我看了其他人的解法,比我的清楚不知道到哪里去了

这个解法的处理是我们有两个方案,一个是选择两个区间,一个是一个区间,只要有一个不满足条件就更新方案

只有当第二个方案的最左端点和最右端点和第一个方案时,那么就说明这一个方案是可以的,可以拿这一个方案和第一个方案选择最优解

详细见代码

#include <iostream>
#include <stdlib.h>
using namespace std;
const int maxn=1e5+10;
int t,n;
int l[maxn],r[maxn],c[maxn];
void solve()
{
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>l[i]>>r[i]>>c[i];
    }
    int id=1,idl=1,idr=1;
    cout<<c[1]<<'\n';
    int ans=0;
    for (int i=2;i<=n;i++)
    {
        if (l[i]<l[idl])idl=i;
        if (l[i]==l[idl]&&c[i]<c[idl])
        {
            idl=i;
        }
        if (r[i]>r[idr])idr=i;
        if (r[i]==r[idr]&&c[i]<c[idr])
        {
            idr=i;
        }
        if (l[i]<l[id]||r[i]>r[id]||(l[i]==l[id]&&r[i]==r[id]&&c[i]<c[id]))
        {
            id=i;
        }
        if (idl==idr) ans=c[idl];
        else ans=c[idl]+c[idr];
        if (l[id]==l[idl]&&r[id]==r[idr])ans=min(ans,c[id]);
        cout<<ans<<'\n';
    }
    return ;
}
int main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

C

交互题反正我是不会,也不想补(摆烂了)

D

D

这一个一开始我是不太明白的

看了题解才明白其中关键

题意是有2nX2n个网格

x表示行,y代表列

对于对于x行,那么对于这一行,每一个的列都减1,如(x,y)变成(x,y-1),但是注意(x,1)变成(x,2n)

对于对于y列,那么对于这一列,每一个的行都加1,如(x,y)变成(x+1,y),但是注意(2n,y)变成(1,y)

我们需要把在左上方(1,1到n,n块)的移动到右下块(n+1,n+1到n+n,n+n),清理到雪块的需要ci,j的费用,(ci,j=0时是没有雪块,只要有人会到达这个雪块,我们就要提前清理),问我们到达右下块最少需要的费用

进入右下块需要一个入口,我们有这么几个入口

(1,n+1)可以到达(n+n,n+1)

(1,n+n)可以到达(n+n,n+n)

(n,n+1)可以到达(n+1,n+1)

(n,n+n)可以到达(n+1,n+n)

(n+1,1)可以到达(n+1,n+n)

(n+1,n)可以到达(n+1,n+1)

(n+n,1)可以到达(n+n,n+n)

(n+n,n)可以到达(n+n,n+1)

然后每一个都需要从这一个入口来,其他的先进入的先占位置,然后在移动,这样一定会移动好的

在这一块的都会需要清除

#include <iostream>
#include <stdlib.h>
using namespace std;
#define int long long 
const int maxn=500+10;
int c[maxn][maxn];
int n,t;
void solve()
{
    cin>>n;
    for (int i=1;i<=n*2;i++)
    {
        for (int j=1;j<=2*n;j++)
        {
            cin>>c[i][j];
        }
    }
    int s=1e9;
    s=min(s,min(c[1][n+1],c[1][n+n]));
    s=min(s,min(c[n][n+1],c[n][n+n]));
    s=min(s,min(c[n+1][1],c[n+1][n]));
    s=min(s,min(c[n+n][1],c[n+n][n]));
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=n;j++)
        {
            s+=c[i+n][j+n];
        }
    }
    cout<<s<<'\n';
    return ;
}
signed  main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

标签:端点,min,int,到达,一个,maxn,2022,Hello
From: https://www.cnblogs.com/righting/p/17018387.html

相关文章

  • 2022年回顾
    前言2022年转眼间已经结束了,随之结束的还有我的大学生活;找了一个游戏开发的工作(超休闲游戏的开发),却发现光有热爱还是远远不够的,还需要坚持的勇气。我坚信着,我现在的经历......
  • Good Bye 2021: 2022 is NEAR D
    D.KeeptheAverageHigh题链又是任何一个任意正整数z,2x+3y=z有整数解。namo对于一个区间和为负数这个区间肯定可以又一些个长度为2长度为3的小区间构成要是我们......
  • Bye2022, Hi2023
    差不多一个多月没怎么出门了,窗外烟花爆竹声不绝于耳,谁也没料到今年的元旦会是这样,就像2020的春节。这一年最大的收获是小瑞瑞出生了,还有很多其他的收获,各方各面的,视野也更......
  • 2022年终总结
    2022年终总结其实本来应该在2022.12.31号之前写完的,但是天有不测风云,在年末还是感染上了新冠,不得不放下手头的这些活,安心养病。比赛全国某某护网在经过一个寒假的养......
  • CVE-2022-26923 Windows域提权漏洞
    前言ActiveDirectory域服务,是一种目录服务,提供了存储目录数据信息以及用户相关的一些密码,电话号码等等一些数据信息,且可让用户和管理员使用这些数据,有利于域管理员对用......
  • 202209-1 如此编码
    题意:第一行给定n和m,表示有n个题目,m表示依据这n个题目的答案计算的结果。第二行给定n个数A1,A2,……An,表示n个题目各自的选项个数。开辟A,B,C三个大小均为n+1的数组。Ci =......
  • 2022年年终总结
    2022年是转行、成长的一年。2月14号从公司回来,脱产自学。要面对家里人及其他一些人所抱有的不解以至于不安,对那时的我来说并不是一件容易的事。在最开始的那段时间里,......
  • 告别2022刚哥准备在2023年干几件大事
    告别20222022年,因为反反复复的疫情,节奏被打得支离破碎。在12月份,政策放开,羊了个羊,发烧后,突然被按下暂停键,也让我看清楚了很多事情。2022年整体比较平淡,没有特别明显的上升......
  • 2022 最新 Spring 面试题(一)
    Spring面试题(一)​​1.为什么要使用spring?​​​​2.解释一下什么是Aop?​​​​3.解释一下什么是ioc?​​​​4.spring有哪些主要模块?​​​​5.spring常用的注入......
  • 2022年度总结
    2022年度总结科研上半年主要在科研,老师给了个题目,然后开始搞。开始主要是读论文、想idea、然后发现没意思或者做过了。有时候积累了一些想法,过几天就发现一点意思都没有......