ACM训练日记—4月26日(省赛练习1)

       今天折腾的真是够呛,明天运动会就不去凑热闹了,老老实实A题看博客,下午集中精力打比赛了。

HDU—6024

题意:

     在一条线上有很多教室,可以在教室建立糖果店,每个教室都有坐标和建立糖果店的费用。如果该教室没有建立糖果店,那么在这个教室左边的糖果店到此教室的距离为此教室的费用,问最小的修建糖果店的费用是多少。

    注意在第一个点上一定要建立糖果店。

来自:https://blog.csdn.net/a1046765624/article/details/79878557

dp[i][j]为到第i个教室,前一个糖果店的位置是j,的最小费用是多少。
分两种,一是在这里修建糖果店。dp[i][i]=min(dp[i][i],dp[i-1][j]+v[i])(1<=j<i)。
二是不修建糖果店。dp[i][j]=min(dp[i][j],dp[i-1][j]+d[i]-d[j])(1<=j<i)。

还有一种思路:

来自:https://blog.csdn.net/STILLxjy/article/details/72514980

      根据题目所给的时间,和题目的数据的大小,我们可以知道题目可以承受住时间复杂度为O(n^2)的算法。
并且每个教室只有两种方案,要么建超市,要么不建。这就很像是背包问题了,所以我们就想到了dp.
我们设dp[i][0]表示在教室i不建超市时前i个教室的费用和的最小值;dp[i][1]表示在教室i建超市时前i个教室的费用和的最小值


        那么我们很快可以得出: dp[i][1] = min(dp[i-1][0],dp[i-1][1]) + ci
关于dp[i][0],由于可以承受住时间复杂度为O(n^2)的算法,那么我们就可以想到枚举离教室i最近的超市j的位置,然后取所有情况的最小值就可以了。
假设左边最近超市为j,那么教室j+1~教室i都不能建超市,所以教室j+1~教室i的费用分别为他们的位置到教室j之间的距离了。当前dp[i][0] = dp[j][1] +( 教室j+1~教室i的费用)
如果我们暴力求解,那么时间复杂度会变成O(n^3),会超时。但是我们会发现由于j是从大到小变化的,所以就可以用:t += (i - j) * (nodes[j+1].x - nodes[j].x);来记录教室j+1~教室i的费用和了。
关于 t += (i - j) * (nodes[j+1].x - nodes[j].x); 的解释: 
比如我们要算x3 - x1 , x2 - x1的sum,那么由于保证了x是升序排列的,所以sum = (x3 - x2) + 2 * (x2 - x1).

const int maxn=3200;//第一种思路
long long dp[maxn][maxn];
struct poin
{
    int x,v;
}a[maxn];
int cmp(poin q,poin w)
{
    return q.x<w.x;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&a[i].x,&a[i].v);
        }
        sort(a+1,a+1+n,cmp);
        memset(dp,0x3f3f3f3f,sizeof(dp));
        dp[1][1]=a[1].v;
        for(int i=2;i<=n;i++)
        {
            dp[i][i]=dp[i][i-1]+a[i].v;
            for(int j=1;j<i;j++)
            {
                dp[i][j]=min(dp[i][j],dp[i-1][j]+a[i].x-a[j].x);
                dp[i][i]=min(dp[i][i],dp[i-1][j]+a[i].v);
            }
        }
        long long sum=0x3f3f3f3f;
        for(int i=1;i<=n;i++)
        {
            sum=min(sum,dp[n][i]);
        }
        printf("%lld\n",sum);
    }

    return 0;
}

HDU—6025

题意:

       给出n个数,问去掉其中一个数ai,问gcd(a1,a2...ai-1,ai+1...an)最大是多少

 找两个数组,处理前i个gcd的值和后i个数的gcd,然后暴力每一个i,maxn=max(maxn,gcd(a[i-1],b[i+1]));就可以了

ll gcd(ll x,ll y)
{
    if(y==0) return x;
    else return gcd(y,x%y);
}
ll a[100005],b[100005];
ll c[100005];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        ll n;
        ll t;
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&c[i]);
        }
        t=c[1];
        for(int i=1;i<=n;i++)
        {
            t=gcd(t,c[i]);
            a[i]=t;
        }
        t=c[n];
        for(int i=n;i>=1;i--)
        {
            t=gcd(t,c[i]);
            b[i]=t;
        }
        ll maxn=max(b[2],a[n-1]);
        for(int i=2;i<=n-1;i++)
        {
            maxn=max(maxn,gcd(a[i-1],b[i+1]));
        }
        cout<<maxn<<endl;
    }
}

HDU—6027 水题,不说了

HDU—6030

题意: 给出红蓝两种,然后排成一个字符串,要求在每一个长度为素数的区间里面是的r(red)的数量不小与b(blue)的数量;

     其实写一下前几项就能发现规律f[i]=f[i-1]+f[i-3];f[2]=3;f[3]=4;f[4]=6;f[5]=9;f[6]=13;

然后构造矩阵,矩阵快速幂就可以了。

const LL mod=1e9+7;
struct Matrix
{
    LL m[5][5];
};
LL n, c;
int ssize = 4;
Matrix Mul(Matrix a,Matrix b)
{
    int i, j, k;
    Matrix c;
    for(i = 1; i <= ssize; i++)
    {
        for(j = 1; j <= ssize; j++)
        {
            c.m[i][j]=0;
            for(k = 1; k <=ssize;k++)
            {
                c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod;
                c.m[i][j]%=mod;
            }
        }
    }
    return c;
}


Matrix pow_mod(Matrix m,LL n)
{
    Matrix b;
    memset(b.m,0,sizeof(b.m));
    for(int i=1;i<=4;i++)
    {
        b.m[i][i]=1;
    }
    while(n>0)
    {
        if(n&1) b=Mul(b,m);
        n=n>>1;
        m=Mul(m,m);
    }
    return b;
}
int main()
{
    LL T,n,k;
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld",&n);
        if(n==2) {cout<<3<<endl;continue;}
        if(n==3) {cout<<4<<endl;continue;}
        if(n==4) {cout<<6<<endl;continue;}
        else if(n==5) {cout<<9<<endl;continue;}
        Matrix str;
        str.m[1][1]=str.m[1][3]=str.m[3][2]=1;//构造矩阵快速幂
        str.m[2][2]=str.m[2][4]=str.m[4][3]=1;
        str.m[1][2]=str.m[1][4]=str.m[2][1]=0;
        str.m[2][3]=str.m[3][1]=str.m[3][4]=0;
        str.m[3][3]=str.m[4][4]=str.m[4][1]=0;
        str.m[4][2]=0;
        n-=5;
        str=pow_mod(str,n);
        LL ans=0;
        ans=(str.m[1][1]*9%mod+str.m[1][2]*6%mod+str.m[1][3]*4%mod+str.m[1][4]*3%mod)%mod;
        cout<<ans<<endl;
    }
    return 0;
}

HDU—6029

题目描述:一种所有结点都有边与之相连的匹配叫做完美匹配。现在你有N个结点,对于n-1个结点,你有两种操作:
(1)将这个结点与之前的所有结点都连一条边
(2)不进行操作;

       来自:https://blog.csdn.net/weixin_39453270/article/details/80026538

 题面分析:这是一道很有意思的思维题。首先要明确的一点是题目只要我们求是否可能是完美匹配,而不是让我们判断是否一定是完美匹配。对于每个结点,当我们要进行第一种操作时,即意味着我们这个结点可以与前面的任意一个结点进行匹配;而当我们进行第二种操作的时候,意味着这个结点是完全孤立的。因为每次操作1时,当前节点的匹配是任意的,考虑到这点,我们可以考虑使用队列去做,即当进行操作1的时候,队列深度减1,当操作为2时,将队列深度加1,最后判断队列是否非空即可。

int a[MAXN];
int n;
int main()
{


    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        if(n%2==1)printf("No\n");
        else
        {
        a[1]=2;
        int f=0;
        int sum=0;
        for(int i=n;i>=1;i--)
        {
            if(a[i]==1)sum++;
            else if(a[i]==2)sum--;
            if(sum<0){f=1;break;}
        }
        if(f)printf("No\n");
        else printf("Yes\n");
        }
    }
    return 0;
}

HDU—6020

题意:

官方题解:

这题更多算是想法题,有脑洞的同学可以各种乱搞。将问题转化成:求去掉KK位数字后,不含前导零,且数字和是否能被三整除。按照预测,这里应该会汇聚本场最多的hack点。

我们设S0S0S1S1S2S2分别为原串上mod 3=0mod3=01122数字的个数。 我们假定删除取模后为001122的数字各AABBCC个,则显然有0<=A<=S0,0<=B<=S1,0<=C<=S20<=A<=S0,0<=B<=S1,0<=C<=S2K=A+B+CK=A+B+CSumSum mod 3=(A*0+B*1+C*2)mod 3=(S0*0+S1*1+S2*2)mod 3=biasmod3=(A0+B1+C2)mod3=(S00+S11+S22)mod3=bias。 枚举CC的值,我们可得B mod 3=(bias-C*2)mod 3,A=K-B-CBmod3=(biasC2)mod3,A=KBC。如果有若干组A,BA,B不逾界,可知这些(A,B,C)(A,B,C)是在模意义下合法的解,但不一定满足没有前导零。

所以,对于【大于00的数】我们贪心地从后往前删除,对于00我们贪心地从前往后删除。

需要统计出:a3a3=第一个【mod 3=0mod3=0且非00的数】前00的个数(如果mod 3=0mod3=0且非00的数不存在,那么a3a3就取所有零的个数),E1E1=【第一个00前是否存在mod 3=1mod3=1的数】,E2E2=【第一个00前是否存在mod 3=2mod3=2的数】。

则以下情况满足任一种都能保证无前导零:A>=a3A>=a3B<B<S1S1E1E1C<C<S2S2E2E2


还需要加一种情况 满足k==n-1 也是yes

      

      这道题其实我的思路和它差不多,就是在n个里面选n-k个加和为3的倍数的情况,先预处理后i个0,1,2,3出现的次数,然后暴力起点(s[i]!=0),接下来还是暴力所有情况。

我感觉可能会超时,明天还得写写看看

来自:https://blog.csdn.net/luricheng/article/details/69264096

代码:https://blog.csdn.net/luricheng/article/details/69264096

const int inf = 1e9 + 7;


const int N = 100000 + 5;
char ch[N];
int x[N];


bool solve(int n,int k)
{
    for(int i=0;i<n;++i)
    {
        x[i]=ch[i]-'0';
        x[i]%=3;
    }
    int s[3]={0,0,0};
    int sum=0;
    for(int i=0;i<n;++i)
    {
        s[x[i]]++;
        sum+=x[i];
    }
    int a3=0;//>0&&mod3==0的第一数 前面的0的个数
    bool e1,e2=e1=0;
    for(int i=0;i<n;++i)
    {
        if(ch[i]!='0'&&x[i]==0) break;
        if(x[i]==0) a3++;
        if(x[i]==1) e1=1;
        if(x[i]==2) e2=1;
    }
    for(int c=0;c<=s[2];++c)
    {
        int minb=((sum-2*c)%3+3)%3;
        for(int b=minb;b<=s[1];b+=3)
        {
            int a=k-b-c;
            if(a>=0&&a<=s[0])
            {
                if((a>=a3)||(e1&&b<s[1])||(e2&&c<s[2])) return 1;
                if(k==n-1) return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,k;
        scanf("%d%d%s",&n,&k,ch);
        if(solve(n,k)) cout<<"yes"<<endl;
        else cout<<"no"<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值