博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round 547 (Div. 3)
阅读量:5089 次
发布时间:2019-06-13

本文共 2530 字,大约阅读时间需要 8 分钟。


layout: post

title: Codeforces Round 547 (Div. 3)
author: "luowentaoaa"
catalog: true
tags:
mathjax: true
- codeforces


(数学)

思路

首先分为情况

如果在第一轮内就打死

或者如果一整轮的伤害大于等于0那一轮相当于白费

如果小于0那就说明肯定可以把怪物打死

所以我们就枚举在第K论之后的哪一回合打死即可

#include
using namespace std;const int maxn=2e5+50;typedef long long ll;ll H,n;ll d[maxn];ll mx=2e18+50;ll s[maxn];int main(){ std::ios::sync_with_stdio(false); cin>>H>>n; ll sum=0; for(ll i=1;i<=n;i++)cin>>d[i],sum+=d[i],s[i]=s[i-1]+d[i]; for(ll i=1;i<=n;i++){ if(-s[i]>=H)mx=min(mx,i); } if(sum<0){ for(ll i=1;i<=n;i++){ ll now=sum+s[i]; now=-now; //cout<<"i="<
<<" now="<
<
=H)mx=min(mx,i+n); else{ ll ned=-sum; ll HH=H; HH-=now; ll time=HH/ned; if(HH%ned)time++; mx=min(mx,time*n+i+n); } } } if(mx==2e18+50)cout<<-1<

(贪心)

思路

首先枚举右端点 同时枚举左端点如果对于这一区间的权值保存的右端点比左端点还大那就加入他,同时更新答案

#include
using namespace std;const int maxn=2e5+50;typedef long long ll;map
>mp;///区间和,次数,最后一次右边界int sum[1550],a[1550];vector
G;struct node{ int num; int R; vector
>ve;}my[1500*1500/2+50];int id(int x){ return lower_bound(G.begin(),G.end(),x)-G.begin();}int main(){ std::ios::sync_with_stdio(false); int n; cin>>n; for(int i=1;i<=n;i++)cin>>a[i],sum[i]=sum[i-1]+a[i]; for(int i=1;i<=n;i++){ int sum=0; for(int j=i;j<=n;j++){ sum+=a[j]; G.push_back(sum); } } sort(G.begin(),G.end()); G.erase(unique(G.begin(),G.end()),G.end()); for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ int s=sum[i]-sum[j-1]; s=id(s); if(j>my[s].R){ my[s].R=i; my[s].num++; my[s].ve.push_back({j,i}); } } } int ans=0,p; for(int i=0;i
ans){ ans=my[i].num; p=i; } } cout<
<

(树)

思路

首先答案肯定是第k+1大的度数

然后就是构造这个树了,我们需要一个可以让颜色不重复的方案,那我们就直接bfs下去就行

#include
using namespace std;typedef long long ll;const int maxn=2e5+50;int n,k;#define bug cout<<"he"<
Q; Q.push(1); memset(edge,-1,sizeof(edge)); edge[1]=-1; while(!Q.empty()){ int now=Q.front(); Q.pop(); int kk=edge[now]; for(int i=Laxt[now];i;i=Next[i]){ if(edge[To[i]]!=-1||To[i]==1)continue; edge[To[i]]=road[id[i]]=(++kk)%maxdu; // cout<<"id="<
<
>n>>k; for(int i=1;i
>u>>v; add(u,v,i); add(v,u,i); ind[u]++;ind[v]++; } sort(ind+1,ind+1+n,greater
()); maxdu=ind[k+1]; cout<
<

转载于:https://www.cnblogs.com/luowentao/p/10569135.html

你可能感兴趣的文章
RUP(Rational Unified Process),统一软件开发过程
查看>>
数据库链路创建方法
查看>>
Enterprise Library - Data Access Application Block 6.0.1304
查看>>
重构代码 —— 函数即变量(Replace temp with Query)
查看>>
Bootstrap栅格学习
查看>>
程序员的数学
查看>>
聚合与组合
查看>>
jQuery如何获得select选中的值?input单选radio选中的值
查看>>
设计模式 之 享元模式
查看>>
如何理解汉诺塔
查看>>
洛谷 P2089 烤鸡【DFS递归/10重枚举】
查看>>
15 FFT及其框图实现
查看>>
Linux基本操作
查看>>
osg ifc ifccolumn
查看>>
C++ STL partial_sort
查看>>
3.0.35 platform 设备资源和数据
查看>>
centos redis 安装过程,解决办法
查看>>
IOS小技巧整理
查看>>
WebDriverExtensionsByC#
查看>>
我眼中的技术地图
查看>>