2017 计蒜客 第五场

题目链接

A. UCloud 机房的网络搭建

 注意0,1的时候特判一下即可。


#include <bits/stdc++.h>

using namespace std;

int a[108];

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  
  int n, m;             
  cin >> n >> m;
  int sum = 0;
  for(int i = 0; i < m; ++i) {
   	cin >> a[i];
   	sum += a[i];
  }
  if(n <= 1) {
      cout << 0 << endl;
      return 0;
  }  
  sort(a, a+m);
  if(sum - m + 1 < n) {
   	cout << "Impossible" << endl;
   	return 0;
  }
  int cnt = 0, cc = 0;
  for(int i = m-1; i >= 0 && a[i] != 0; --i) {
    cc++;
    cnt += a[i];
    if(cnt - cc + 1 >= n) break;
  }
  cout << cc << endl;
  return 0;
}


 C. UCloud 的安全秘钥(简单)+(中等)

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 50000 + 7;

int s[MAXN], t[MAXN];
int num1[MAXN], num2[MAXN];

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, m;
  cin >> n;
  for(int i = 0; i < n; ++i) {
   	cin >> s[i];
  }
  cin >> m;
  int k;
    
  while(m--) {
    int ans = 0;
    cin >> k;
    if(k > n) {
      cout << 0 << endl;
      continue;
    }
    fill(num1, num1 + MAXN, 0);
    fill(num2, num2 + MAXN, 0);
    for(int i = 0; i < k; ++i) {
      cin >> t[i];
      num2[t[i]]++;
      num1[s[i]]++;
    }
    int cnt = 0;
    for(int i = 1; i <= n; ++i) {
      if(num1[i] != num2[i]) {
        cnt++;
      }
    }
    if(cnt == 0) {
      ans++;
    }
    for(int i = k; i < n; ++i) { 
     	int pre = i - k;
     	int cur = i;
     	if(num1[s[pre]] == num2[s[pre]]) cnt++;
     	else if(num1[s[pre]] - 1 == num2[s[pre]]) cnt--;
     	num1[s[pre]]--;
     	
     	if(num1[s[cur]] == num2[s[cur]]) cnt++;
     	else if(num1[s[cur]] + 1 == num2[s[cur]]) cnt--;
     	num1[s[cur]]++;
     	
     	if(cnt == 0) ans++;
    }
    cout << ans << endl;
  }
  return 0;
}


 C. UCloud 的安全秘钥(困难)

 关了流的cin都会卡,以后还是老老实实用scanf把!,这里总长度不会超过200000, 所以有很多很小的匹配串,把长度在10以内的预处理一下。

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 100000 + 7;

int n, k;
int s[MAXN], t[MAXN];
int num1[MAXN], num2[MAXN];

map<vector<int>, int > ans;

void check() {
  vector<int> v;
  for(int i = 0; i < k; ++i) {
    v.push_back(t[i]);
  }
  sort(v.begin(), v.end());
  printf("%d\n", ans[v]);
}

int main() {
  scanf("%d", &n);
  for(int i = 0; i < n; ++i) {
   	scanf("%d", &s[i]);
  }
  for(int i = 0; i < n; ++i) {
    vector<int> v;
    for(int j = i; j < i + 10 && j < n; ++j) {
      v.push_back(s[j]);
      sort(v.begin(), v.end());
      ans[v]++;	  
    }
  }
  int m;
 scanf("%d", &m); 
  while(m--) {
    int ans = 0;
    scanf("%d", &k);
    for(int i = 0; i < k; ++i) {
      scanf("%d", &t[i]);
    }
    if(k > n) {
      puts("0");
      continue;
    }
    if(k <= 10) {
      check();
      continue;
    }
    memset(num1, 0, sizeof(num1));
    memset(num2, 0, sizeof(num2));
    for(int i = 0; i < k; ++i) {
      num1[s[i]]++;
      num2[t[i]]++;
    }
    int cnt = 0;
    for(int i = 1; i <= n; ++i) {
      if(num1[i] != num2[i]) {
        cnt++;
      }
    }
    if(cnt == 0) {
      ans++;
    }
    for(int i = k; i < n; ++i) { 
     	int pre = i - k;
     	int cur = i;
     	if(num1[s[pre]] == num2[s[pre]]) cnt++;
     	else if(num1[s[pre]] - 1 == num2[s[pre]]) cnt--;
     	num1[s[pre]]--;
     	
     	if(num1[s[cur]] == num2[s[cur]]) cnt++;
     	else if(num1[s[cur]] + 1 == num2[s[cur]]) cnt--;
     	num1[s[cur]]++;
     	
     	if(cnt == 0) ans++;
    }
   printf("%d\n", ans);
  }
  return 0;
}



内容概要:本文深入研究了基于深度强化学习(DRL)的微网储能系统控制策略。首先介绍了微网系统的组成及其特性,重点探讨了光伏发电、储能系统和负荷系统的关键组件数学模型。接着详细描述了Simulink仿真设计实现,包括微网环境模拟类(MicrogridEnv)、双重深度Q网络(Double DQN)算法的实现以及训练过程。为了验证该方法的有效性,文章还进行了对比实验,分别测试了规则策略、传统优化方法和DDQN策略的表现。实验结果显示,DDQN策略在成本节约、SOC合规率等方面明显优于其他两种方法。最后,本文提出了创新点与贡献总结,包括仿真-学习一体化框架、改进的DRL算法以及多维度验证,并展望了后续研究方向如多时间尺度优化、多能源协同、不确定性处理等。 适用人群:从事电力系统、微网技术研究的专业人士,以及对深度强化学习应用于能源领域感兴趣的科研人员和工程师。 使用场景及目标:①掌握微网储能系统的基本构成与工作原理;②理解如何利用深度强化学习优化微网储能控制策略;③学习具体的算法实现细节,包括环境搭建、DDQN算法实现和训练流程;④对比不同控制策略的效果,评估DDQN策略的优势。 其他说明:本文不仅提供了理论分析和技术实现,还展示了详细的实验验证过程,通过具体的实验数据证明了所提方法的有效性。此外,文中提及的多种改进措施和技术细节对于实际工程项目具有重要的参考价值。阅读本文有助于读者全面了解微网储能控制领域的最新进展,为相关研究和技术开发提供有益的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值