目录

A - Jessica's Reading Problem

B - Bound Found

C - Subsequence

D - Tallest Cow

E - Straight Master

F - 非常男女

G - 矩形A + B


A - Jessica's Reading Problem

题意:

杰西卡·黄面临期末考试的严峻挑战,她平时并没有认真听课,但一个追求她的男生帮她画了范围和知识点,因此两人的关系更进一步。
现在书上一共有P页,每页上有一个关于a[i]的知识点,知识点可能重复。
请问杰西卡最少需要看几页就能复习完。

思路:

先用想办法计算出总共有多少种知识点。

之后便是尺取找最短的序列满足条件。

  • 考察点:尺取,思维

代码:

//卡输入,必须scanf或快读
//关闭输入流+"\n"还是会T
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e6+100;map<int,int> mp;int a[maxn];
int main()
{int n,k=0;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(mp[a[i]]==0) k++;mp[a[i]]=1;}mp.clear();int l=1,r=1;int cnt=0,len=inf;while(l<=n){while(r<=n&&cnt<k){if(mp[a[r]]==0) cnt++;mp[a[r++]]++;}if(cnt<k) break;len=min(len,r-l);mp[a[l]]--;if(mp[a[l++]]==0) cnt--;}printf("%d\n",len);
}

B - Bound Found

题意:

现在给你一个长度为n的序列a,a[i]<=10000。
接下来会有k次询问,每次询问会给出一个值t。
找到a的一个子序列使得这个子序列的和的绝对值尽可能地接近t。

输出这个子序列的序列和它的起始位置与终止位置。

思路:

首先求出1~r的所有的前缀和并进行存储。

接下来进行尺取,具体过程请看代码注释。

  • 考察点:尺取,排序,思维

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+500;
struct node
{int x,r;   ///x:前缀和  r代表:1~r之前的数的和为xnode(){}node(int xx,int rr):x(xx),r(rr){}
};bool cmp(node z,node c){return z.x<c.x;
}
node a[maxn];
int main()
{int n,k,t;ios::sync_with_stdio(false);while(cin>>n>>k&&n&&k){a[0].x=0;a[0].r=0;for(int i=1;i<=n;i++){cin>>a[i].x;a[i].x=a[i].x+a[i-1].x;a[i].r=i;}sort(a,a+1+n,cmp);
//        for(int i=1;i<=n;i++){
//            cout<<a[i].x<<" "<<a[i].r<<endl;
//        }for(int i=0;i<k;i++){cin>>t;int l=0,r=1;int finl,finr;int mint=inf;int ans;while(mint&&r<=n){        //mint=0 =>存在完全相符的答案,直接输出即可int chazhi=a[r].x-a[l].x;//cout<<a[r].r<<" "<<a[l].r<<" "<<chazhi<<" "<<mint<<endl;if(abs(chazhi-t)<=mint){ans=chazhi;finl=a[l].r;finr=a[r].r;mint=abs(chazhi-t);}if(chazhi>t) l++;if(chazhi<t) r++;if(l==r) r++;}if(finl>finr) swap(finl,finr);cout<<ans<<" "<<finl+1<<" "<<finr<<endl;}}
}

C - Subsequence

题意:

给定一个长为n的序列a,求a的一个最短子序列长度满足:

该子序列和>=S

思路:

裸的尺取,干就完了!

  • 考察点:尺取

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+500;
int a[maxn];
int main()
{int t,n,s;ios::sync_with_stdio(false);cin>>t;while(t--){cin>>n>>s;for(int i=1;i<=n;i++)cin>>a[i];int l=1,r=1;int ans=inf;int sum=0;while(l<=n){while(sum<s&&r<=n){sum+=a[r++];}if(sum<s)break;ans=min(ans,r-l);sum-=a[l++];}if(ans==inf) cout<<"0\n";else cout<<ans<<"\n";}
}

D - Tallest Cow

题意:

FJ有N头牛,先给出最高的牛的编号和高度。(牛的高度为整数)

接下来会给出r组数据:
x y
代表x牛平视y牛,编号(x+1)~(y-1)的牛会比两边矮(矮多少不知道,反正就是矮)
请你最后给出每头牛最高是多少?

思路:

利用到差分数组的特性:处理区间增减问题,非常的简单。

  • 考察点:差分数组

  • 坑点:会有重复数据出现

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int maxn=1e4+500;
int a[maxn];
int main()
{int n,i,h,r,x,y;map<pair<int,int>,int> mp;cin>>n>>i>>h>>r;memset(a,0,sizeof(a));a[0]=h;for(int i=0; i<r; i++){cin>>x>>y;if(x>y) swap(x,y);if(mp[make_pair(x,y)])continue;mp[make_pair(x,y)]=1;a[x+1]-=1;a[y]+=1;
//        for(int i=1; i<=n; i++)
//        {
//            if(i!=1)
//                cout<<" ";
//            cout<<a[i];
//        }
//        cout<<endl;}for(int i=1; i<=n; i++){a[i]=a[i]+a[i-1];}for(int i=1; i<=n; i++){if(i!=1)cout<<" ";cout<<a[i];}cout<<endl;
}

E - Straight Master

题意:

给你一个长为n的数组,每次你可以选择一个长为3,4,5的区间使其中的值减1。
问是否能把所有的数变成0。

思路:

利用差分数组特性:

对于数组a产生的差分数组b,使数组a的a[l]~a[r]全部减1=>b[l]-1  b[r+1]+1

接下来是关键:

  1. b[1]==a[1],所以b[1]一定为正数。
  2. b[2],b[3]若小于0,对于有效范围内没有数据可以填补两者。(b[2]想变成正数就需要b[2-1-3]减一,但不存在,b[3]同理)
  3. 最后在b[len]后添加一个b[len+1]==0-a[len],用于减去最后一个元素a[len]。

接下来就很简单了,就是拿前面的正数去弥补后面的负数。如果正好为0则说明可以,否则不可以。

其中还要注意边界判断。

  • 考察点:数学,思维,差分

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=2e5+100;ll a[maxn],b[maxn];int main()
{ios::sync_with_stdio(false);int t,n;cin>>t;for(int c=1;c<=t;c++){cin>>n;a[0]=0;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)b[i]=a[i]-a[i-1];b[n+1]=0-a[n];if(b[2]<0||b[3]<0){cout<<"Case #"<<c<<": No\n";continue;}ll sum=0;for(int i=1;i<=n;i++){sum+=b[i];int pos=i+3;if(pos>n+1)  //边界break;if(b[pos]<0){sum+=b[pos];b[pos]=0;}if(sum<0) break;}if(sum==0) cout<<"Case #"<<c<<": Yes\n";else cout<<"Case #"<<c<<": No\n";}
}

F - 非常男女

题意:

中文你我?懂?

思路:

01可能不是很方便我们统计人数,将代表女生的0换成-1,那么这道题就转换成求一个最长子序列满足序列和为0。

  • 考察点:前缀和,思维

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int maxn=1e5+500;
int a[maxn];
int sum[maxn];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]==0) a[i]=-1;}sum[0]=0;for(int i=1;i<=n;i++){sum[i]=sum[i-1]+a[i];}map<int,int> mp;int len=-1;for(int i=1;i<=n;i++){if(sum[i]==0){len=max(len,i);}else{if(mp[sum[i]]&&len<i-mp[sum[i]])len=i-mp[sum[i]];else if(!mp[sum[i]])mp[sum[i]]=i;}}cout<<len<<endl;
}

G - 矩形A + B

题意:

中文你我?懂?

思路:

排列组合问题,共有(n+1)条横着的线和(m+1)条竖着的线,问可以产生多少个矩形?

  • 考察点:数学,思维,排列组合

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;int main()
{int t;cin>>t;while(t--){int n,m;cin>>n>>m;cout<<((n+1)*n/2)*((m+1)*m/2)<<endl;  //C[2](n+1) * C2(m+1)}
}

HRBU 2021暑期训练解题报告阶段三Day2相关推荐

  1. HRBU 2021暑期训练解题报告阶段二Day1

    A - Breadth First Search 题意: 请编写一个程序,求给定的有向图G(V,E) 中顶点1到各顶点的最短路径( 路 径边数的最小值).各顶点编号分别为1至n.如果从顶点1出发无法到 ...

  2. HRBU 2021暑期训练解题报告Day1

    目录 A - Stack B - Queue C - Shaolin D - Equal Sums E - Potions (Hard Version) F - Buy and Resell G - ...

  3. HRBU 2021暑期训练解题报告Day3

    目录 A - Bombing B - Constructing the Array C - 士兵队列训练问题 D - Anagram E - Fence Repair F - Black Box G ...

  4. 牛客2021暑期训练1-A-Alice and Bob

    牛客2021暑期训练1-A-Alice and Bob 题目链接 题意 给定两堆石子n,m(1<=n,m<=5e3),Alice先手,对任意一堆取k(k>0)个,另一堆取s*k(s& ...

  5. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  6. 2021年暑期训练阶段三Day2

    目录 A - Jessica's Reading Problem B - Bound Found C - Subsequence D - Tallest Cow E - Straight Master ...

  7. NOIP1998-2018 CSP-S2 2019 2021提高组解题报告与视频

    CSP-S 2020 讲题录屏 CSP-S 2020 讲题录屏_哔哩哔哩_bilibili 冠军说题--ACM世界冠军吴卓杰,带你复盘2020 CSP-S2 冠军说题--ACM世界冠军吴卓杰,带你复盘 ...

  8. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  9. 东南大学2004年程序设计第一届初赛解题报告

    东南大学2004年第一届逻辑算法大赛初赛解题报告 农夫三拳@seu                                                                    ...

最新文章

  1. Redis 命令--Redis列表(List))
  2. jemter安装Transactions per Second和Response Times Over Time插件
  3. 看透 Go 对象内部细节的神器
  4. 模拟——生活大爆炸版石头剪刀布(洛谷 P1328)
  5. Android笔记 - 如何避免ActivityNotFound异常,查看Activity堆栈信息,获取进程名
  6. C++ 面向对象程序三大特性之 继承
  7. python进阶20装饰器
  8. Android10apk怎么传数据,Android不同apk之间传递参数与数据
  9. 挑战《IT我最大》Windows 7由你秀 活动的丑恶行径
  10. 拖后腿了吗?工信部称8兆以上宽带占比44.4%
  11. 测试了MySQL实时监控工具Nero Profile SQL
  12. 神通数据库适配 hibernate
  13. 如何给这些textbox中赋值
  14. STM32 F103之点亮LED流水灯 (STM32入门学习)
  15. 在外部JS中使用validity进行表单验证出现未定义问题
  16. (转)熊绎:我看软件工程师的职业规划
  17. 2022-2028全球与中国交通信号控制系统市场现状及未来发展趋势
  18. 《打开U盘发现全部文件变成快捷方式了》
  19. LSF - 提交GUI应用到LSF无法运行,报错Failed to connect to socket /tmp/dbus-xxxxxxxxx: Connection refused
  20. 近似商标可以申请吗?

热门文章

  1. Linux服务器测试性能脚本
  2. 11.python-列表保存成csv格式
  3. VS Code有趣插件
  4. 告诫一些正在路上敏捷开发前端的人...
  5. matlab三维 旋转矩阵,matlab中的三维坐标系与旋转
  6. soundex 算法
  7. 编码器如何推流给斗鱼直播平台
  8. 新托福写作:三选一题型写法
  9. 利用mysql实现分页
  10. HaaS600物联网开发板学习笔记(二)---轻应用方式让LED闪烁起来