2017 国庆湖南 Day6
期望得分:100+100+60=260
实际得分:100+85+0=185
二分最后一条相交线段的位置
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 100001 int x[N],y[N];
struct node
{
int b;
double k;
}Point[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
freopen("geometry.in","r",stdin);
freopen("geometry.out","w",stdout);
int n; read(n);
for(int i=;i<=n;++i) read(x[i]);
for(int i=;i<=n;++i) read(y[i]);
sort(x+,x+n+);
sort(y+,y+n+);
for(int i=;i<=n;i++)
{
Point[i].b=y[i];
Point[i].k=-y[i]*1.0/x[i];
}
int m; read(m);
int a,b; double g;
int l,r,mid,ans;
while(m--)
{
read(a); read(b);
g=1.0*b/a;
l=;r=n; ans=;
while(l<=r)
{
mid=l+r>>;
if(Point[mid].b/(g-Point[mid].k)<=a) ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
}
}
差分约束
设s[i]表示前i个时刻实际招的人数
那么可得约束条件:
a[i]<=s[i]-s[i-7]<=b[i] i>=7
a[i]<=s[i]+s[23]-s[16+i]<=b[i] i<7
0<=s[i]-s[i-1]<=b[i]
第二个式子中含有3个未知数
只有两个与i有关
设s[23]=T
那么枚举T,判断当前情况是否有解即可
#include<cstdio>
#include<cstring>
#include<queue> #define N 25 using namespace std; int a[N],b[N]; int front[N],nxt[],to[],tot,val[]; int d[N];
bool vis[N]; void add(int u,int v,int w)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w;
} bool spfa()
{
queue<int>q;
memset(vis,false,sizeof(vis));
memset(d,-,sizeof(d));
d[]=; vis[]=true;
q.push();
int now;
while(!q.empty())
{
now=q.front(); q.pop(); vis[now]=false; for(int i=front[now];i;i=nxt[i])
if(d[to[i]]<d[now]+val[i])
{
d[to[i]]=d[now]+val[i];
if(d[to[i]]>) return false;
if(!vis[to[i]]) vis[to[i]]=true,q.push(to[i]);
}
}
return true;
} bool solve(int t)
{
memset(front,,sizeof(front)); tot=;
for(int i=;i<;i++)
{
add(i-,i+,a[i]);
// printf("%d %d %d\n",i-7,i+1,a[i]);
}
for(int i=;i<=;i++)
{
// printf("%d %d %d\n",i+17,i+1,a[i]-t);
add(i+,i+,a[i]-t);
}
for(int i=;i<;i++)
{
// printf("%d %d\n",i,i+1);
add(i,i+,);
}
for(int i=;i<;i++)
{
// printf("%d %d %d\n",i+1,i,-b[i]);
add(i+,i,-b[i]);
}
add(,,t); add(,,-t);
return spfa();
} int main()
{
freopen("cashier.in","r",stdin);
freopen("cashier.out","w",stdout);
int T,ans;
scanf("%d",&T);
while(T--)
{
for(int i=;i<;i++) scanf("%d",&a[i]);
for(int i=;i<;i++) scanf("%d",&b[i]);
ans=;
while()
{
if(++ans>) { ans=-; break; }
if(solve(ans)) break;
}
printf("%d\n",ans);
}
}
考场85分贪心
枚举时刻i,作为首先招人满足的时刻
从 它即它往前7个点, 招人,招的人时刻尽可能的靠后
满足它之后,枚举j 到 i-1 再 同样的方法招人
此贪心成立的前提是,存在一个时刻招的人=min(a[i],b[i])
但最优解可能不是这样
假设前面招了x1、x2、x3……个人
最后面招了y个人
这个y会覆盖前面的x1、x2、x3……
#include<cstdio>
#include<algorithm>
using namespace std;
int need[],have[];
int now[],rest[];
int main()
{
freopen("cashier.in","r",stdin);
freopen("cashier.out","w",stdout);
int T;
scanf("%d",&T);
int ans;
while(T--)
{
ans=1e9;
for(int i=;i<;i++) scanf("%d",&need[i]);
for(int i=;i<;i++) scanf("%d",&have[i]);
for(int k=;k<;k++)
{
if(!need[k]) continue;
for(int i=;i<;i++) rest[i]=have[i],now[i]=need[i];
int j=k,cnt=,sum=;
while(now[k] && cnt<)
{
if(j==-) j=;
cnt++;
if(rest[j]<now[k])
{
for(int h=;h<;h++) now[(h+j)%]-=rest[j];
sum+=rest[j];rest[j]=;
}
else
{
int cut=now[k];
for(int h=;h<;h++) now[(h+j)%]-=cut;
rest[j]-=cut;sum+=cut;
}
j--;
}
if(now[k]) continue;
bool f=true;
for(int i=k+,t=;t<=;t++,i++)
{
if(i==) i=;
if(now[i]<=) continue;
j=i; cnt=;
while(now[i] && cnt<)
{
if(j==-) j=;
cnt++;
if(rest[j]<now[i])
{
for(int h=;h<;h++) now[(h+j)%]-=rest[j];
sum+=rest[j];rest[j]=;
}
else
{
int cut=now[i];
for(int h=;h<;h++) now[(h+j)%]-=cut;
rest[j]-=cut,sum+=cut; }
j--;
}
if(now[i]) { f=false; break; }
}
if(f) ans=min(ans,sum);
}
printf("%d\n",ans==1e9 ? - : ans);
}
}
就是这个http://www.cnblogs.com/TheRoadToTheGold/p/7679195.html
2017 国庆湖南 Day6的更多相关文章
- 2017 国庆湖南 Day5
期望得分:76+80+30=186 实际得分:72+10+0=82 先看第一问: 本题不是求方案数,所以我们不关心 选的数是什么以及的选的顺序 只关心选了某个数后,对当前gcd的影响 预处理 cnt[ ...
- 2017 国庆湖南 Day1
卡特兰数 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ] ...
- 2017 国庆湖南 Day3
期望得分:100+30+60=190 实际得分:10+0+55=65 到了233 2是奇数位 或223 第2个2是偶数位就会223 .233 循环 #include<cstdio> #de ...
- 2017 国庆湖南 Day4
期望得分:20+40+100=160 实际得分:20+20+100=140 破题关键: f(i)=i 证明:设[1,i]中与i互质的数分别为a1,a2……aφ(i) 那么 i-a1,i-a2,…… i ...
- 2017 国庆湖南Day2
期望得分:100+30+100=230 实际得分:100+30+70=200 T3 数组开小了 ..... 记录 1的前缀和,0的后缀和 枚举第一个1的出现位置 #include<cstdio& ...
- 学大伟业 2017 国庆 Day1
期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...
- 2017国庆 清北学堂 北京综合强化班 Day1
期望得分:60+ +0=60+ 实际得分:30+56+0=86 时间规划极端不合理,T2忘了叉积计算,用解析几何算,还有的情况很难处理,浪费太多时间,最后gg 导致T3只剩50分钟,20分钟写完代码, ...
- 牛客国庆集训day6 B Board (模拟标记思维或找规律或分块???)
链接:https://www.nowcoder.com/acm/contest/206/B来源:牛客网 题目描述 恬恬有一个nx n的数组.她在用这个数组玩游戏: 开始时,数组中每一个元素都是0. 恬 ...
- 2017.10.1 国庆清北 D1T1 zhx的字符串题
题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...
随机推荐
- C++中不同变量、函数在内存中的内存情况《转》
一.一个C++编译的程序占用的内存分为以下几个部分 1.栈区:由编译器自动分配 存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈. 2.堆区:一般由程序员分配释放,若程序员不释放,程序结 ...
- onmouse事件
常用的鼠标事件:onmouseenter,onmouseleave,onmouseover,onmouseout,onmouseup,onmousedown,onmousewheel,onmousem ...
- 11.C++-临时对象分析
首先来参考以下代码: #include <stdio.h> class Test { int mi; public: Test(int i) { mi = i; } Test() { Te ...
- Django 2.0 学习(02):Django视图和URL(上)
接上篇博文,接下来我们以具体代码例子来说明Django的基本流程. 创建项目 使用Win+R,输入cmd进图windows命令行模式: 再你想要存放项目工作的磁盘,输入下面命令: django-adm ...
- .Net调用钉钉接口,实现发送企业消息功能
我在钉钉官网上看了下,关于调用钉钉接口,发送企业消息通知,他给的核心代码总共几行. 用到的一个接口引用 TopSDK.dll 下载网址https://open-doc.dingtalk.com/doc ...
- 【OpenCV-Python:实现人脸、人眼、嘴巴识别】实战(一)
AI时代的到来,手机上的APP开始应用人脸识别去完成事情,如iphoneX的人脸解锁,百度自动贩卖机的人脸识别系统进行支付,支付宝的人脸识别登录等,提高了使用软件的易用性,但也因为其便利性,在某些市面 ...
- The POM for ... is missing, no dependency information available
今天在重温淘淘商城的项目,准备用idea重写次,换个bootstrap的前端框架,但是在用idea构建maven项目后编译时却报错了: 经再三确认,common工程自身并没有任何问题,引用这个工程的地 ...
- 分享Java的9个知识点
关于java编程的知识,有人会问哪些是重要的知识点,不知道大家是否都知道呢? 现在兄弟连 小编给大家分享以下9点内容,仔细看咯! 1.多线程并发 多线程是Java中普遍认为比较难的一块.多线程用好了可 ...
- Flask入门HelloWorld
Flask入门HelloWorld Flask官网:http://flask.pocoo.org/ Flask中文翻译:http://dormousehole.readthedocs.io/en/la ...
- 格式化JSON数据
function formatJson(json, options) { var reg = null, formatted = '', pad = 0, PADDING = ' '; options ...