1046. Plane Spotting排序

本文介绍了一个关于找出最优连续子序列的问题——PlaneSpotting排序,并详细解释了解题思路及实现代码。通过定义子序列的优先级,使用结构体表示子序列并重写比较操作,实现了所有可能子序列的有效排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
1046. Plane Spotting排序
题目大意:
        给出一个长度为N的非负整数序列(所有数不超过200),还有两个整数M和K,求前M个最优的长度不小于K的连续子序列。
        连续子序列的优先级如何比较
        1、平均值大的序列优于平均值小的
        2、条件1相同情况下,长度大的序列优于长度小的
        3、条件1和2相同情况下,结束位置靠前的序列优于结束位置靠后的
        1≤N≤300,1≤M≤100,1≤K≤300
解题思路:
        使用结构体表示一个子序列,重写比较操作"<"。
        对所有可能的子序列进行排序。
        struct period {
        	double aver;
        	int length,ends;
        };
        bool operator <(const period &a,const period &b){
        	if (fabs(a.aver-b.aver)>1e-6) return a.aver>b.aver;
        	if (a.length!=b.length) return a.length>b.length;
        	return a.ends<b.ends;
        }
        重点:更加好的循环方法
            for (i=0;i<n;i++) {
        	temp=0;
        	for (j=i+1;j<n;j++) {
        		temp+=a[j];
        		if (j-i+1>=k) {
        			p[cnt].length=j-i+1;
        			p[cnt].ends=j+1;
        			p[cnt].aver=(double)temp/(j-i+1);
        			cnt++;
        		}
        	}
        }
        sort(p,p+cnt);
*/
#include <iostream>
#include <cstdlib> //system("pause");
#include <algorithm>
using namespace std;

//1.重点:当需要表示关系组合数据时,学会使用结构体 
struct period{
    int start;
    int end;
    double aver;
};

//2.重点:学会使用sort函数 (#include <algorithm>) 
bool compare(period a, period b)
{
      if(a.aver > b.aver)
         return 1;
      if(a.aver == b.aver && (a.end - a.start > b.end - b.start))
         return 1;
      if(a.aver == b.aver && (a.end - a.start == b.end - b.start) && (a.end < b.end))
         return 1;
      return 0;
}


int main(){
    
    int N;
    cin >> N;
    struct period p[100000];
    
    for(int i=0;i<N;i++){
        
        int qN;
        int bestpN;
        int minqN;
        int plane[300];       
        cin >> qN >> bestpN >> minqN;
        
        for(int j=0;j<qN;j++){
            cin >>  plane[j];
        }
        //3.重点:三次循环,例如:分别是(5、6、、、n)(1-5,2-6,、、、,(n-5)-n)(1到5累加) 
        int c=0;    
        for(int sampleqN=minqN;sampleqN<=qN;sampleqN++){        
            for(int t=0;t+sampleqN<=qN;t++){
                double sum=0;
                for(int k=t;k-t<sampleqN;k++){
                    sum = sum+plane[k];
                }
                p[c].start=t+1;
                p[c].end=t+sampleqN;
                p[c].aver=sum/sampleqN;
                c++;  
            }                  
        }  
        //4.重点:学会使用sort函数 (#include <algorithm>)    
       sort(p,p+c,compare);  
       cout << "Result for run "<< i+1 << ":" << endl;
       for(int k=0; k<bestpN && k<c; k++){
          cout << p[k].start << "-" << p[k].end << endl;
       }    
    }   
    //system("pause");
    return 0;
}

内容概要:本文针对火电厂参与直购交易挤占风电上网空间的问题,提出了一种风火打捆参与大用户直购交易的新模式。通过分析可再生能源配额机制下的双边博弈关系,建立了基于动态非合作博弈理论的博弈模型,以直购电价和直购电量为决策变量,实现双方收益均衡最大化。论文论证了纳什均衡的存在性,并提出了基于纳什谈判法的风-火利益分配方法。算例结果表明,该模式能够增加各方收益、促进风电消纳并提高电网灵活性。文中详细介绍了模型构建、成本计算和博弈均衡的实现过程,并通过Python代码复现了模型,包括参数定义、收益函数、纳什均衡求解、利益分配及可视化分析等功能。 适合人群:电力系统研究人员、能源政策制定者、从事电力市场交易的工程师和分析师。 使用场景及目标:①帮助理解风火打捆参与大用户直购交易的博弈机制;②为电力市场设计提供理论依据和技术支持;③评估不同政策(如可再生能源配额)对电力市场的影响;④通过代码实现和可视化工具辅助教学和研究。 其他说明:该研究不仅提供了理论分析,还通过详细的代码实现和算例验证了模型的有效性,为实际应用提供了参考。此外,论文还探讨了不同场景下的敏感性分析,如证书价格、风电比例等对市场结果的影响,进一步丰富了研究内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值