pat1041-1050

没想到半天就做完了10题 = =,这几题太简单了,基本10分钟一题
1041

#include<cmath>
#include<map>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
const int INF = 0x3f3f3f3f;
#define MP(x, y) make_pair(x, y)

int A[N];
map<int, int> mp;
int main() {
  int n;
  while(~scanf("%d", &n)) {
    mp.clear();
    for(int i = 1; i <= n; ++i) scanf("%d", &A[i]), mp[A[i]] ++;

    int fl = 0;
    for(int i = 1; i <= n; ++i) {
      if(mp[A[i]] == 1) {
        printf("%d\n", A[i]); fl = 1;
        break;
      }
    }
    if(!fl) printf("None\n");
  }
  return 0;
}

1042

#include<cmath>
#include<map>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 4e4+5;
const int INF = 0x3f3f3f3f;
#define MP(x, y) make_pair(x, y)

int card[2][N]; int fl;
void put(int x) {
  int t1 = (x-1)/13;
  int t2 = (x-1)%13;
  t2 ++;

  if(t1 == 4) printf("J%d", t2);
  else if(t1 == 3) printf("D%d", t2);
  else if(t1 == 2) printf("C%d", t2);
  else if(t1 == 1) printf("H%d", t2);
  else printf("S%d", t2);
}
int Swap[60];
int main() {
  int K;
  while(~scanf("%d", &K)) {
    fl = 0;
    for(int i = 1; i <= 54; ++i) card[fl][i] = i;

    for(int i = 1; i <= 54; ++i) scanf("%d", &Swap[i]);

    for(int i = 0; i < K; ++i) {
      for(int j = 1; j <= 54; ++j) {
        card[fl^1][Swap[j]] = card[fl][j];
      }
      fl ^= 1;
    }

    for(int i = 1; i <= 54; ++i) {
      if(i != 1) printf(" ");
      put(card[fl][i]);
    }
    printf("\n");
  }
  return 0;
}

1043 这题还是花了一点时间。这是一个反证思想,虽然你按照这个序列插入的树,其他序列可能插入也是这样,但是你反过来验证一下不就行了= =

#include<cmath>
#include<map>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e3+5;
const int INF = 0x3f3f3f3f;
#define MP(x, y) make_pair(x, y)

int n;
int A[N];
int lef[N], righ[N];
int root;


void find(int x, int id) {
  if(A[x] <= A[id]) {
    if(righ[x] == 0) righ[x] = id;
    else find(righ[x], id);
  }else {
    if(lef[x] == 0) lef[x] = id;
    else find(lef[x], id);
  }
} 

void _find(int x, int id) {
  if(A[x] > A[id]) {
    if(righ[x] == 0) righ[x] = id;
    else _find(righ[x], id);
  }else {
    if(lef[x] == 0) lef[x] = id;
    else _find(lef[x], id);
  }
} 
int output[N]; int cnt = 0;
void preorder(int x) {
  ++cnt; output[cnt] = x;
  if(lef[x])  preorder(lef[x]);
  if(righ[x]) preorder(righ[x]);
}
void postorder(int x) {
  if(lef[x]) postorder(lef[x]);
  if(righ[x]) postorder(righ[x]);
  ++cnt; output[cnt] = x;
}

int main() {
  while(~scanf("%d", &n)) {
    memset(lef, 0, sizeof(lef));
    memset(righ, 0, sizeof(righ));

    for(int i = 1; i <= n; ++i) {
      scanf("%d", &A[i]);  
    }

    root = 1;
    for(int i = 2; i <= n; ++i) {
      find(root, i);
    }
    cnt = 0;
    preorder(root);
    int flag = 1;
    for(int i = 1; i <= n; ++i) {
      if(output[i] != i) {
        flag = 0; break;
      }    
    }

    if(flag) {
      cnt = 0;
      printf("YES\n");
      postorder(root);  
      for(int i = 1; i <= n; ++i) {
        if(i != 1) printf(" ");
          printf("%d", A[output[i]]);
      }
      printf("\n");
      continue;
    }

    memset(lef, 0, sizeof(lef));
    memset(righ, 0, sizeof(righ));

    root = 1;
    for(int i = 2; i <= n; ++i) {
      _find(root, i);
    }
    cnt = 0;
    preorder(root);
    flag = 1;
    for(int i = 1; i <= n; ++i) {
      if(output[i] != i) {
        flag = 0; break;
      }    
    }

    if(flag) {
      cnt = 0;
      printf("YES\n");
      postorder(root);
      for(int i = 1; i <= n; ++i) {
        if(i != 1) printf(" ");
        printf("%d", A[output[i]]);
      }
      printf("\n");  
    }else printf("NO\n");




  }
  return 0;
}

1044 二分一下就行,比较简单

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<algorithm>
#include<ctime>
#include<cstdlib>

using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e5+5;
typedef long long ll;

int value[N];
int suf[N];

int main() {
  int n, m;
  while(~scanf("%d %d", &n, &m)) {
    int fl = 0;
    for(int i = 1; i <= n; ++i) {
      scanf("%d", &value[i]);
  //    if(value[i] <= 0) while(1);
    }

    suf[0] = 0;

    int pre = 0;
    int minn = INF;
    for(int i = 1; i <= n; ++i) {
      pre += value[i];
      suf[i] = pre;
  //    printf("%d ", suf[i]);
    //  if(i == 1) continue;

      int id = lower_bound(suf, suf+i, pre-m) - suf;
      if(suf[id] == pre-m) {
        printf("%d-%d\n", id+1, i);
        fl = 1;
      }else {
        if(id == 0) continue;
        int tt = suf[i] - suf[id-1];
        if(tt > m) minn = min(minn, tt);
      }
    }

    if(!fl) {
      pre = 0;
      for(int i = 1; i <= n; ++i) {
        pre += value[i];
        suf[i] = pre;
      //  if(i == 1) continue;
        int id = lower_bound(suf, suf+i, pre - minn) - suf;
        if(suf[id] == pre - minn) {
          printf("%d-%d\n", id+1, i);
        //  fl = 1;
        }
      }
    }
  }
  return 0;
}

1045 这题dp,每次讨论一个点,找到此时,小于等于该物品喜欢程度为结尾的物品的最大值,当然我用树状数组加速了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<algorithm>
#include<ctime>
#include<cstdlib>

using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e5+5;
typedef long long ll;

int fav[205];
int fav_[205];
int stripe[10005];

int tree[205];
int n, m, len;
void add(int pos, int num) {
  for(int i = pos; i <= m; i += i&-i) {
    tree[i] = max(tree[i], num);  
  }
}
int sum(int pos) {

  int ans = 0;
  for(int i = pos; i; i -= i&-i) {
    ans = max(ans, tree[i]);
  }
  return ans;
}



int main() {
  while(~scanf("%d", &n)) {
    memset(fav_, 0, sizeof(fav_));
    memset(tree, 0, sizeof(tree));

    scanf("%d", &m);
    for(int i = 1; i <= m; ++i) {
      scanf("%d", &fav[i]);
      fav_[fav[i]] = i;
    }
    scanf("%d", &len);
    for(int i = 1; i <= len; ++i) {
      scanf("%d", &stripe[i]);
    }

    for(int i = 1; i <= len; ++i) {
      if(fav_[stripe[i]] == 0) continue;

      int id = fav_[stripe[i]];
      int tt = sum(id)+1;


      add(id, tt);
    }

    printf("%d\n", sum(m));
  }
  return 0;
}

1046

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<algorithm>
#include<ctime>
#include<cstdlib>

using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e5+5;
typedef long long ll;

int d[N];
ll suf[N];
int main() {
  int n, m;
  while(~scanf("%d", &n)) {

    suf[0] = 0;
    for(int i = 1; i <= n; ++i) {
      scanf("%d", &d[i]);
      suf[i] = suf[i-1] + d[i];
    }
    scanf("%d", &m);
    for(int i = 1; i <= m; ++i) {
      int a, b; scanf("%d %d", &a, &b);
      if(a > b) swap(a, b);
      ll tmp = suf[b-1] - suf[a-1];
      ll ans = min(tmp, suf[n] - tmp);
         printf("%lld\n", ans);  
    }


  }
  return 0;
}

1047 还是先将字符串处理成了数字,这样更快

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<algorithm>
#include<ctime>
#include<cstdlib>

using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e5+5;
typedef long long ll;

int change(char *a) {
  int ans = 0;
  for(int i = 0; i < 3; ++i) {
    ans = ans*100 + a[i]-'A';
  }
  ans = ans*100 + a[3]-'0'+30;
  return ans;
}
void put(int x) {
  printf("%c%c%c%c\n", x/1000000+'A', (x%1000000)/10000+'A', (x%10000)/100+'A', (x%100-30)+'0' ); 
}
vector<int> course[2505];

int main() {
  int n, k;
  while(~scanf("%d %d", &n, &k)) {
    for(int i = 1; i <= k; ++i) course[i].clear();

    for(int i = 0; i < n; ++i) {
      char s[10]; int a;
      scanf("%s %d", s, &a);
      int id = change(s);
      for(int j = 0; j < a; ++j) {
        int b; scanf("%d", &b);
        course[b].push_back(id);
      } 
    }

    for(int i = 1; i <= k; ++i) {
      printf("%d %d\n", i, course[i].size());
      sort(course[i].begin(), course[i].end());
      for(int j = 0; j < course[i].size(); ++j) {
        put(course[i][j]);
      }
    }
  }
  return 0;
}

1048

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#include<map>

using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e5+5;
typedef long long ll;

int coin[N];
map<int, int> mp;
int main() {
  int n, m;
  while(~scanf("%d %d", &n, &m)) {
    mp.clear();
    for(int i = 1; i <= n; ++i) {
      scanf("%d", &coin[i]);
      mp[coin[i]] ++;
    }

    sort(coin+1, coin+n+1);
    int fl = 0;
    for(int i = 1; i <= n; ++i) {
      int re = m - coin[i];

      if(re == coin[i]) {
        if(mp[re] >= 2) {
          printf("%d %d\n", re, re); fl = 1;
          break;
        }
      }else {
        if(mp.find(re) != mp.end()) {
          printf("%d %d\n", coin[i], re); fl = 1;
          break;
        }
      } 
    }
    if(!fl) printf("No Solution\n");
  }
  return 0;
}

1049 这题还是要想下,先预处理 0-999999 那么一个大于1e6的数就可以拆分成前五位,后五位来做就行啦

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#include<map>

using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e6;
typedef long long ll;

ll num[N];
int cal(int x) {
  int ans = 0;
  while(x) {
    int tt = x%10;
    if(tt == 1) ans ++;
    x /= 10;  
  }
  return ans;
}
int main() {
  num[0] = 0;
  for(int i = 1; i < N; ++i) {
    num[i] = num[i-1] + cal(i);
  }

  int x;
  while(~scanf("%d", &x)) {
    if(x < 1e6) printf("%lld\n", num[x]);
    else {
      int t1 = x % 1000000; int t2 = x / 1000000;
      ll ans = (num[t2]-cal(t2)) * 1e6 + 1ll*cal(t2)*(t1+1) + num[999999] * t2 + num[t1];
      printf("%lld\n", ans);
    }
  }
  return 0;
}

1050

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#include<map>

using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e4+5;
typedef long long ll;

char a[N], b[N];
int has[200];
int main() {
  memset(has, 0, sizeof(has));
  gets(a); gets(b);

  for(int i = 0; b[i]; ++i) {
    has[b[i]] ++;
  }

  for(int i = 0; a[i]; ++i) {
    if(!has[a[i]]) printf("%c", a[i]);
  }
  printf("\n");
  return 0;
}
下载前必看:https://renmaiwang.cn/s/bvbfw Verilog设计_串并转换 / 移位寄存器实现了一种串并转换的功能,其核心原理在于移位寄存器的运用。 这里详细展示了串转并以及并转串两种不同的设计方案。 每一种转换模式都设有专属的使能信号,同时并行输出数据的格式提供了两种选择:最低有效位优先(lsb)和最高有效位优先(msb)。 串并转换技术主要应用于串行传输与并行传输这两种数据传输模式之间的相互转换,而移位寄存器是达成这一目标的常用工具,能够支持并行及串行的数据输入与输出操作。 这些移位寄存器通常被设定为“串行输入、并行输出”(SIPO)或“并行输入、串行输出”(PISO)两种工作模式。 在串行数据输出的过程中,构成数据和字符的码元会按照既定的时间顺序逐位进行传输。 相比之下,并行数据传输则是在同一时刻将固定数量(普遍为8位或16位等)的数据和字符码元同时发送至接收端。 数据输入通常采用串行格式进行。 一旦数据成功输入寄存器,它便可以在所有输出端同时被读取,或者选择逐位移出。 寄存器中的每个触发器均设计为边沿触发类型,并且所有触发器均以特定的时钟频率协同工作。 对于每一个输入位而言,它需要经过N个时钟周期才能最终在N个输出端呈现,从而完成并行输出。 值得注意的是,在串行加载数据期间,并行输出端的数据状态应保持稳定。 数据输入则采用并行格式。 在将数据写入寄存器的操作过程中,写/移位控制线必须暂时处于非工作状态;而一旦需要执行移位操作,控制线便会变为激活状态,并且寄存器会被锁定以保持当前状态。 只要时钟周期数不超过输入数据串的长度,数据输出端Q将按照预定的顺序逐位读出并行数据,并且必须明确区分最低有效位(LSB)和最高有效位(MSB)。
内容概要:本文档是PCI-SIG发布的工程变更通知(ECN),旨在为PCIe Base Specification 7.0中的组件测量与认证(CMA-SPDM)功能增加对后量子密码学(PQC)算法的支持。基于NIST发布的PQC标准(FIPS 203、204、205)以及NSA提出的CNSA 2.0安全套件要求,文档明确新设备必须强制支持ML-DSA-87(用于数字签名)和ML-KEM-1024(用于密钥封装)两种PQC算法,同时允许选择性支持传统算法(如RSA、ECC)或其他NIST批准的PQC参数集。变更不影响现有硬件或软件兼容性,但建议通过厂商特定配置机制灵活启用或禁用算法以应对未来安全演进。此外,文档指出PQC可能带来消息体积增大和性能延迟问题,并推荐使用CHUNK_CAP机制处理大数据传输及利用SPDM协议的“ResponseNotReady”机制缓解响应超时风险。; 适合人群:从事PCIe协议开发、安全芯片设计、固件开发及相关标准制定的技术人员,尤其是涉及国家安全或高安全性系统的产品开发者。; 使用场景及目标:①指导PCIe设备实现符合CNSA 2.0要求的后量子安全通信能力;②帮助开发人员理解如何在SPDM框架下集成PQC算法并处理性能与兼容性挑战;③为测试团队提供新增C&I测试需求的依据。; 阅读建议:此文档技术性强,需结合SPDM 1.4规范与NIST相关标准(FIPS 203/204/205)同步研读,重点关注第6.31.3至6.31.5节的具体算法要求与实现注释,便于在产品设计中提前规划密码模块升级路径。
【多智能体控制】有向图下含未知输入领导者的多智能体系统分布式二分时变队形控制研究(Matlab代码实现)内容概要:本文研究了在有向图通信拓扑下,含未知输入领导者的多智能体系统实现分布式二分时变队形控制的问题。通过设计分布式观测器估计领导者的状态与未知输入,并结合控制协议实现跟随者对领导者队形的跟踪,确保系统在存在外部干扰或不确定性输入的情况下仍能保持预设的时变队形结构。文中采用Lyapunov稳定性理论证明了闭环系统的收敛性,并通过Matlab仿真验证了所提方法的有效性和鲁棒性。该研究拓展了多智能体协同控制的应用边界,尤其适用于敌对环境下的分组包围、区域探测等任务场景。; 适合人群:具备自动控制、多智能体系统、图论基础的研究生、科研人员及从事智能控制算法开发的工程师;熟悉Matlab仿真工具的相关技术人员。; 使用场景及目标:①研究多智能体系统在复杂通信拓扑下的协同控制机制;②实现对具有未知动态行为领导者的一致性跟踪与队形保持;③应用于无人机集群、无人艇编队、智能机器人协作等需要分布式自主控制的实际系统中。; 阅读建议:建议读者结合Matlab代码深入理解观测器设计与控制律推导过程,重点关注有向图条件下的信息传递机制与稳定性分析方法,同时可尝试扩展至切换拓扑、时延通信等更复杂情形以提升实际应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值