A. 打怪

先求出每次打死一只怪需要掉多少血,然后就直接算出能够打死多少只。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{IO;int T=1;cin>>T; while(T--){int h,a,H,A;cin>>h>>a>>H>>A;int cnt=(H+a-1)/a;int p=(cnt-1)*A;if(p) cout<<(h-1)/p<<'\n';else cout<<"-1\n";}return 0;
}

B. 吃水果

不妨设n<mn<mn<m,如果我们先吃kkk次然后加倍一次能够使得m=nm=nm=n那么需要满足2×(n−k)=m−k2×(n-k)=m-k2×(n−k)=m−k,得出k=2n−mk=2n-mk=2n−m,由此只需先让加倍到2n>=m2n>=m2n>=m然后吃kkk次再次加倍然后在吃m−km-km−k次即可吃完,由此上面贪心一定最小。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{IO;int T=1;cin>>T;while(T--){int n,m;cin>>n>>m;if(n>m) swap(n,m);int res=m;while(n<m){res++;n*=2;}cout<<res<<'\n';}    return 0;
}

C. 四个选项

首先先用并查集统计出每个连通块的数量,然后把每一个连通块看成一个物品,跑一边背包问题即可。
状态表示:f(i,j,k,l,r)f_{(i,j,k,l,r)}f(i,j,k,l,r)​考虑前iii个物品,答案A选了jjj个,答案B选了kkk个,答案C选了lll个,答案D选了rrr个的集合。
状态转移:考虑第iii个物品放在哪个答案中不难写出转移。
感觉这方法有点暴力,但是思路应该还是非常好理解

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=15;
int p[N],sz[N];
ll f[N][N][N][N][N];
int find(int x)
{return x==p[x]?x:p[x]=find(p[x]);
}
int main()
{IO;int T=1;//cin>>T;while(T--){for(int i=1;i<=12;i++) p[i]=i,sz[i]=1;int a,b,c,d,m;cin>>a>>b>>c>>d>>m;vector<int> v;v.push_back(0);while(m--){int a,b;cin>>a>>b;int pa=find(a),pb=find(b);if(pa==pb) continue;sz[pb]+=sz[pa];p[pa]=pb;}for(int i=1;i<=12;i++) if(p[i]==i) v.push_back(sz[i]);f[0][0][0][0][0]=1;int n=v.size()-1;for(int i=1;i<=n;i++)for(int j=0;j<=a;j++)for(int k=0;k<=b;k++)   for(int l=0;l<=c;l++)for(int r=0;r<=d;r++){if(j>=v[i]) f[i][j][k][l][r]+=f[i-1][j-v[i]][k][l][r];if(k>=v[i]) f[i][j][k][l][r]+=f[i-1][j][k-v[i]][l][r];if(l>=v[i]) f[i][j][k][l][r]+=f[i-1][j][k][l-v[i]][r];if(r>=v[i]) f[i][j][k][l][r]+=f[i-1][j][k][l][r-v[i]];}cout<<f[n][a][b][c][d]<<'\n';}return 0;
}

D.最短路变短了

原图跑一边dijsktra算出dist1[i]表示1~i的最短距离,在跑一边反图算出dist2[i]表示i~n的最短距离。
考虑如果u→vu\to vu→v之间的边取反能够缩短1→n1\to n1→n的最短距离,那么说明目前最短路径一定是1→⋯→v→u→⋯→n1\to \dots \to v\to u\to \dots \to n1→⋯→v→u→⋯→n,因此只需要判断该条件是否成立即可得到答案(dist1[v]+dist2[u]+c<dist1[n]

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pli;
const int N=100010,M=400010;
int h1[N],h2[N],e[M],ne[M],idx;
ll w[M];
ll dist1[N],dist2[N];
bool st[N];
struct node
{int u,v;ll w;
}E[M];
int n,m,q;
void add(int h[],int a,int b,ll c)
{e[idx]=b;ne[idx]=h[a];w[idx]=c;h[a]=idx++;
}
void dijkstra(int start,int h[],ll dist[])
{memset(dist,0x3f,8*N);memset(st,0,sizeof st);priority_queue<pli,vector<pli>,greater<pli> >q;dist[start]=0;q.push({0,start});while(q.size()){int t=q.top().second;q.pop();if(st[t]) continue;st[t]=1;for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(dist[j]>dist[t]+w[i]){dist[j]=dist[t]+w[i];q.push({dist[j],j});}}}
}
int main()
{IO;int T=1;//cin>>T;while(T--){memset(h1,-1,sizeof h1);memset(h2,-1,sizeof h2);cin>>n>>m;for(int i=1;i<=m;i++){cin>>E[i].u>>E[i].v>>E[i].w;add(h1,E[i].u,E[i].v,E[i].w);add(h2,E[i].v,E[i].u,E[i].w);}dijkstra(1,h1,dist1);dijkstra(n,h2,dist2);cin>>q;while(q--){int id;cin>>id;int u=E[id].u,v=E[id].v,c=E[id].w;if(dist1[n]>dist1[v]+dist2[u]+c) cout<<"YES\n";else cout<<"NO\n";}}return 0;
}

E.相似的子串

字符串哈希+二分
二分扫一遍序列即可,用哈希表记录出现次数已经最后一次出现的位置。
时间复杂度O(nlogn)O(nlogn)O(nlogn)

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=200010,P=131;
unordered_map<ull,pii> mp;
ull h[N],p[N];
int n,k;
char s[N];
ull get(int l,int r)
{return h[r]-h[l-1]*p[r-l+1];
}
bool check(int mid)
{mp.clear();for(int i=mid;i<=n;i++){ull v=get(i-mid+1,i);if(mp[v].second<=i-mid) {mp[v].first++;mp[v].second=i;if(mp[v].first>=k) return 1;}}return 0;
}
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n>>k;cin>>s+1;p[0]=1;for(int i=1;i<=n;i++){p[i]=p[i-1]*P;h[i]=h[i-1]*P+s[i]-'a'+1;}int l=0,r=n;while(l<r){int mid=l+r+1>>1;if(check(mid)) l=mid;else r=mid-1;}cout<<l<<'\n';}return 0;
}

F.苹果树

点分治?待补?

牛客练习赛 61(待补F-点分治?)相关推荐

  1. 牛客练习赛61 - B - 吃水果

    题目描述 最近米咔买了n个苹果和m个香蕉,他每天可以选择吃掉一个苹果和一个香蕉(必须都吃一个,即如果其中一种水果的数量为0,则他不能进行这个操作),或者使用魔法将某一种水果的数量翻倍. 现在米咔想吃西 ...

  2. 牛客练习赛61 B 吃水果 题解

    链接:https://ac.nowcoder.com/acm/contest/5026/B 来源:牛客网 题目描述 最近米咔买了n个苹果和m个香蕉,他每天可以选择吃掉一个苹果和一个香蕉(必须都吃一个, ...

  3. 牛客练习赛19 E和F(签到就走系列)托米的饮料+托米搭积木

    E题传送门:点我 F题传送门:点我 可爱的小托米得到了n瓶饮料. 但他不小心把开盖的工具弄丢了,所以他只能利用饮料瓶来开盖. 已知第i个瓶子的品牌为ai,且其能打开bi品牌的瓶子. 问有几瓶饮料托米无 ...

  4. 牛客练习赛61 C 四个选项 dp\搜索+组合数学

    https://ac.nowcoder.com/acm/contest/5026/C 思路一:dpdpdp,首先通过并查集处理出所有的连通块(限制条件),然后用dpi,x,y,z,wdp_{i,x,y ...

  5. 牛客练习赛61 C 四个选项(并查集、DP、排列组合)难度⭐⭐⭐

    链接:https://ac.nowcoder.com/acm/contest/5026/C 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64 ...

  6. 牛客练习赛61 D 最短路变短了(最短路,反向最短路)难度⭐⭐⭐★

    最短路变短了 链接 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format:%lld 题目描述 给定一个有向带权图,其中 ...

  7. 牛客练习赛61 E 相似的子串(二分+哈希)难度⭐⭐⭐

    相似的子串 题目链接 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format:%lld 题目描述 给定一个字符串,要求取 ...

  8. 牛客练习赛61 B 吃水果

    题目描述 最近米咔买了n个苹果和m个香蕉,他每天可以选择吃掉一个苹果和一个香蕉(必须都吃一个,即如果其中一种水果的数量为0,则他不能进行这个操作),或者使用魔法将某一种水果的数量翻倍. 现在米咔想吃西 ...

  9. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. IPVS: Can't initialize ipvs: Protocol not available解决方法
  2. 大数据批量导入,解决办法,实践从定时从 sqlserver 批量同步数据到 mySql
  3. SAP收发存报表程序
  4. 31岁负债59万(房贷27万,私人借款32万),该怎么办?
  5. 揭秘!双非渣本Android四年磨一剑,学习路线+知识点梳理
  6. 20 图|Nacos 手摸手教程
  7. c#中connect函数_Flink算子使用方法及实例演示:union和connect
  8. jar k8s 自己的 部署_微服务架构 - 离线部署k8s平台并部署测试实例
  9. 火星地形地貌图,摄影:“祝融号”火星车
  10. x264编码详细文字全过程
  11. mali GPU 官网指南
  12. SCI分区:JCR分区和中科院分区 的差别
  13. 徐思201771010132《面向对象程序设计(Java)》第十二周学习总结
  14. 3万字长文概述:通俗易懂告诉你什么是.NET?什么是.NET Framework?什么是.NET Core?
  15. Nouveau源码分析(三):NVIDIA设备初始化之nouveau_drm_probe
  16. maxcms整合html5播放器,【整合】马克斯cms4.0以上版本整合ckplayer6.8[支持PC+手机WAP]ckplayerX...
  17. uni-app 184查看好友朋友圈完善(五)
  18. Ubuntu 20.10 引导修复(boot repair)
  19. 手把手教你做树莓派魔镜-MagicMirror(七)-接下来
  20. r语言计算 java gUI_Windows64位系统用R软件运行rjava程序计算MIC值,以及一些问题...

热门文章

  1. docker es持久化_使用docker数据卷对容器数据持久化
  2. Linux语言写的高通滤波,高通滤波器c语言实现
  3. 剑指offer——01二维数组中的查找.
  4. 全年营业额怎么计算_门店盈亏平衡计算及案例分析 | 商品管理
  5. 集合的定义与并查操作(C语言)
  6. 走迷宫-双向bfs解法
  7. 玩转二叉树 (25 分) 知中序遍历和前序遍历,求做个镜面反转后的层序遍历
  8. 数据结构与算法--贪婪算法2
  9. qiankun 微前端_qiankun 微前端应用实践与部署(二)
  10. C语言 ---文件读取