20211012NOIP模拟赛

非常抱歉,没有题面;

简单总结:

第一题打表22分,第二题2分,第三题特判29分;总分数53分;

一如既往的菜~~~

1.A。

思路:用一个栈来存储数据;

如果两个数之间有空位,就放在栈的最后一位+2上,入栈;

如果没有,ans*=栈的大小+1,为什么呢?因为前size+1个数每一个数都可以先出战,所以是size+1,该元素不入栈;

处理完后:站内的元素想怎么出栈都可以所以是阶乘;

复制代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 inline long long read(){
 4     static char ch;
 5     long long res=0;
 6     long long sign=1;
 7     while((ch=getchar())<'0'||ch>'9'){
 8         if(ch=='-'){
 9             sign=-1;
10         }
11     }
12     res=ch-'0';
13     while((ch=getchar())>='0'&&ch<='9'){
14         res=res*10+ch-'0';
15     }
16     return res*sign;
17 }
18 const long long P=1e9+7;
19 int n;
20 int main(){
21     cin>>n;
22     vector<int> a(n);
23     for(int i=0;i<n;i++){
24         cin>>a[i];
25     }
26     vector<int > b(1,1);
27     long long ans=1;
28     for(int i=1;i<n;i++){
29         if(a[i]!=b.back()+1){
30             b.push_back(b.back()+2);
31         }else{
32             ans=(long long)ans*(b.size()+1)%P;//该元素在前b.size个元素中的出战顺序,首尾加上中间的间隔随便排 
33         }
34     }
35     for(int i=0;i<(int)b.size();i++){
36         ans=ans*(long long)(i+1)%P;//剩下的元素出战顺序随意 
37     }
38     printf("%lld\n",ans);
39     
40     return 0;
41 }
复制代码

2.

用最短路我着实没有想到;

用一个差分数组记录每一个分界点的位置,

每一次改变都连一条边,每个分界点跑一次最短路,然后找出两两相加的最小值

 

posted @   SSZX_loser_lcy  阅读(40)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示