NOIP2014-9-6模拟赛
工资
(money/money.in/money.out)
时限1000ms 内存256MB
聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi。有m个结算工钱的时间,聪哥可以自由安排这些时间,也就是说什么时候拿钱,老板说的不算,聪哥才有发言权!(因为聪哥是土豪,他是老板的老板)
聪哥不喜欢身上一次性有太多的钱,于是他想安排一下拿钱的时间,使他一次性拿的钱中最大的最小。(最后一天一定要领钱)
输入
第一行 2个数 n,m
接下来n行,每行一个数,代表Vi.
输出
最小的最大钱数。
样例输入
7 5
100
400
300
100
500
101
400
样例输出
500
样例说明
100 400//300 100//500//101//400//
“//”表示老大要去拿钱。
数据范围
20% 1<=n<=20
另 20% 1<=n<=50,Vi的和不超过1000
100% 1<=n<=100,000,m<=n,Vi<=10,000
第二题 藏妹子之处(excel)
问题描述:
今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格。但要满足如下的两个条件:
(1)任意两个单元格都不在同一行。
(2)任意两个单元格都不在同一列。
选取格子存在一个花费,而这个花费是三个格子两两之间曼哈顿距离的和(如(x1,y1)和(x,y2)的曼哈顿距离为|x1-x2|+|y1-y2|)。狗狗想知道的是,花费在minT到maxT之间的方案数有多少。
答案模1000000007。所谓的两种不同方案是指:只要它选中的单元格有一个不同,就认为是不同的方案。
输入格式:
一行,4个整数,R、C、minT、maxT。3≤R,C≤4000, 1≤minT≤maxT≤20000。
对于30%的数据, 3 ≤ R, C ≤ 70。
输出格式:
一个整数,表示不同的选择方案数量模1000000007后的结果。
输入输出样例:
输入样例 |
3 3 1 20000 |
3 3 4 7 |
4 6 9 12 |
7 5 13 18 |
4000 4000 4000 14000 |
输出样例 |
6 |
0 |
264 |
1212 |
859690013 |
Problem 3 银河之星(galaxy.cpp/c/pas)
T1:
二分贪心
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 100005
#define ll long long
using namespace std;
int a[MAXN];
int n,m;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int check(int w){
int cnt=,s=;
for(int i=;i<=n;i++){
if(s+a[i]>w){
cnt++;
if(cnt>m){
return ;
}
s=a[i];
}
else{
s+=a[i];
}
}
return ;
}
int main()
{
int L=,R=;
n=read();m=read();
for(int i=;i<=n;i++){
a[i]=read();
R+=a[i];
L=max(L,a[i]);
}
while(R-L>){
int mid=((ll)R+(ll)L)/;
if(check(mid)){
R=mid;
}
else{
L=mid+;
}
}
if(check(L)){
printf("%d\n",L);
}
else{
printf("%d\n",R);
}
return ;
}
Code1
T2:
数学分析,发现代价就是三个点组成的矩形的边长,枚举之后分两种情况:
1,两个点在矩形的对角线顶点,第三点到处逛~
左上-右下对角线 (x-1)*(y-1)
左下-右上对角线 (x-1)*(y-1)
2,一个点在矩形的一个顶点,其余两个点分别在其余的两条边
(x-1)(y-1)
然后矩形有4个顶点,所以是4*(x-1)(y-1)
可以证明,至少有一个点在矩形的顶点处
所以根据加法原理,有6*(x-1)(y-1)种情况,
然后矩形可以在局域里面到处跑,总共可以跑(n-x+1)*(m-y+1)处
乘起来即可
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MOD 1000000007
#define ll long long
using namespace std;
ll n,m,s,t;
ll ans;
int main()
{
// freopen("data.in","r",stdin);
scanf("%lld%lld%lld%lld",&n,&m,&s,&t);
n--;m--;
if(s%==) s++;
if(t%==) t--;
if(t>(n+m)*){
t=(n+m)*;
}
for(ll i=s;i<=t;i+=){
ll d=i/;
for(ll j=max(1LL,d-m);j<=min(n,d-);j++){
ans=(ans+(*(j-)*(d-j-))%MOD*(n-j+)%MOD*(m-(d-j)+)%MOD)%MOD;
}
}
printf("%lld\n",ans);
return ;
}
Code2
T3:
一开始以点的位置为状态,用hash加搜索,结果好慢好慢啊,T了8个点
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
#define MAXN 105
#define MOD 1000003
#define P 17
#define pii pair<int,int>
using namespace std;
int gx[]={,,,,,-,-,-};
int gy[]={,-,,,-,,,-};
int k,n,m,x0,y0;
bool b[MOD];
struct Node{
int s;
pii p[];
};
queue<Node> q;
int hash(Node t){
int ret=;
for(int i=;i<k;i++){
if(t.s&(<<i)){
ret=(ret+t.p[i].first*MAXN+t.p[i].second)%MOD;
}
ret=ret*P%MOD;
}
return ret;
}
int Abs(int x){
return (x>)?x:-x;
}
int bfs(){
while(!q.empty()){
int s=q.front().s;
pii p[];
memcpy(p,q.front().p,sizeof(p));
q.pop();
int L=,cnt;
for(int i=;i<k;i++){
if(s&(<<i)){
L++;
cnt=i;
}
}
if(==L){
if(Abs(p[cnt].first-x0)%==&&Abs(p[cnt].second-y0)%==){
return ;
}
continue;
}
int a[MAXN][MAXN]={};
for(int i=;i<k;i++){
if(s&(<<i)){
a[p[i].first][p[i].second]=i+;
}
}
for(int i=;i<k;i++){
if(s&(<<i)){
for(int d=;d<;d++){
int dx=p[i].first,dy=p[i].second;
for(int j=;j<=;j++){
dx+=gx[d];
dy+=gy[d];
}
if(<=dx&&dx<=n&&<=dy&&dy<=m&&!a[dx][dy]){
Node t;
t.s=s;
memcpy(t.p,p,sizeof(t.p));
t.p[i]=make_pair(dx,dy);
int h=hash(t);
if(!b[h]){
b[h]=;
q.push(t);
}
}
}
}
}
for(int i=;i<k;i++){
if(s&(<<i)){
for(int d=;d<;d++){
int dx=p[i].first,dy=p[i].second;
dx+=gx[d];
dy+=gy[d];
if(a[dx][dy]){
int v=a[dx][dy]-;
dx+=gx[d];
dy+=gy[d];
if(<=dx&&dx<=n&&<=dy&&dy<=m&&!a[dx][dy]){
Node t;
t.s=s^(<<v);
memcpy(t.p,p,sizeof(t.p));
t.p[i]=make_pair(dx,dy);
int h=hash(t);
if(!b[h]){
b[h]=;
q.push(t);
}
}
}
}
}
}
}
return ;
}
void solve(){
memset(b,,sizeof(b));
while(!q.empty()) q.pop();
Node t;
t.s=(<<k)-;
for(int i=;i<k;i++){
scanf("%d%d",&t.p[i].first,&t.p[i].second);
}
b[hash(t)]=;
q.push(t);
if(bfs()){
printf("Yes\n");
}
else{
printf("No\n");
}
}
int main()
{
// freopen("data.in","r",stdin);
while(~scanf("%d%d%d%d%d",&k,&n,&m,&x0,&y0)){
solve();
}
return ;
}
Code3-1
后来发现,应当抓住问题的性质,即能否到达,而不是最短距离之类
由于坐标相差3的倍数的点可以互相移动到达,不妨认为就是一个点了,然后只会存在9种点
0 1 2 0 1 2
3 4 5 3 4 5
6 7 8 6 7 8
0 1 2 0 1 2
3 4 5 3 4 5
6 7 8 6 7 8
这样移动三步的情况就解决了
然后移动两步比如0+4=8 3+4=5
注意需要考虑这种情况
1 X X
X X X
X X 1
一般来说0+8=4
但是这种情况下地图只有这么小,你的0跑到8底下就超出范围了
所以不能直接计算,需要枚举处理合法的情况
然后问题迎刃而解了
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<map>
#define MAXN 102
#define P 11
#define ll long long
using namespace std;
map<ll,bool> mp;
int gx[]={,,-,-,-,,,};
int gy[]={-,,-,,,-,,};
int K,n,m,ed;
int G[][];
ll hash(int a[]){
ll ret=;
for(int i=;i<;i++){
ret=ret*P+a[i];
}
return ret;
}
int place(int x,int y){
return ((x-)%)*+(y-)%;
}
void init(){
memset(G,-,sizeof(G));
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
for(int k=;k<;k++){
int x1=i+gx[k],y1=j+gy[k];
int x2=x1+gx[k],y2=y1+gy[k];
if(<=x2&&x2<=n&&<=y2&&y2<=m){
int t1=place(i,j);
int t2=place(x1,y1);
int t3=place(x2,y2);
G[place(i,j)][place(x1,y1)]=place(x2,y2);
}
}
}
}
}
int dfs(ll x){
if(x==ed){
return ;
}
int b[]={};
for(int i=;i>=;i--){
b[i]=x%;
x/=;
}
for(int i=;i<;i++){
for(int j=;j<;j++){
if(b[i]&&b[j]&&G[i][j]!=-){
int d[]={};
memcpy(d,b,sizeof(d));
d[i]--;
d[j]--;
d[G[i][j]]++;
ll h=hash(d);
if(!mp[h]){
mp[h]=;
if(dfs(h))
return ;
}
}
}
}
return ;
}
int main()
{
// freopen("data.in","r",stdin);
int x,y;
while(~scanf("%d%d%d%d%d",&K,&n,&m,&x,&y)){
mp.clear();
init();
int b[]={};
b[place(x,y)]++;
ed=hash(b);
b[place(x,y)]--;
for(int i=;i<=K;i++){
scanf("%d%d",&x,&y);
b[place(x,y)]++;
}
ll h=hash(b);
mp[h]=;
if(dfs(h)){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return ;
}
Code3-2
这是一道搜索的好题,提醒我们铭记问题的性质决定求解的方法
NOIP2014-9-6模拟赛的更多相关文章
- 2014-9-13 NOIP模拟赛
NOIP2014模拟赛 ——lwher 题目名 环上的游戏 舞蹈课 数位和乘积 源文件 cycle.cpp/c/pas dancingLessons.pas/cpp digit.cpp.cpp/c/p ...
- 2014-10-23 NOIP模拟赛
NOIP2014模拟赛 -----lwher 时限均为1s,内存 256MB 1.Jams倒酒(pour) Jams是一家酒吧的老板,他的酒吧提供2种体积的啤酒,a ml 和 b ml,分别使用容积为 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 小奇模拟赛9.13 by hzwer
2015年9月13日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...
- PKUSC 模拟赛 day1 下午总结
下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...
- [GRYZ]寒假模拟赛
写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...
随机推荐
- 冲刺NO.7
Alpha冲刺第七天 站立式会议 项目进展 前期数据库设计所遗留的问题在今天得到了部分的解决,对物资管理所需要的数据内容进行了细化,但并未开始编写物资相关模块,主要精力还是放在项目的核心功能(信用管理 ...
- Java Client/Server 基础知识
Java的网络类库支持多种Internet协议,包括Telnet, FTP 和HTTP (WWW),与此相对应的Java网络类库的子类库为: Java.net Java.net.ftp Java. ...
- itchat 微信的使用
#coding=utf8 import itchat # 自动回复 # 封装好的装饰器,当接收到的消息是Text,即文字消息 @itchat.msg_register('Text') def text ...
- Flask 学习 六 大型程序结构
pip freeze >requirement.txt 自动生成版本号 pip install -r requirement.txt 自动下载对应的库 梳理结构 config.py #!/usr ...
- Hibernate之深入持久化对象
Hibernate是一个彻底的O/R Mapping 框架.之所以说彻底,是因为相对于其他的 框架 ,如Spring JDBC,iBatis 需要手动的管理SQL语句,Hibernate采用了完全 面 ...
- ajax的原理解析
一.关于同步与异步的分析: 异步传输是面向字符的传输,它的单位是字符:而同步传输是面向比特的传输,它的单位是桢,它传输的时候要求接受方和发送方的时钟是保持一致的.而ajax就是采用的异步请求方式的. ...
- jq 滚轮监听事件
windowAddMouseWheel(); function windowAddMouseWheel() { var i = 0; var scrollFunc = function (e) { e ...
- javascript学习(1)用户的Javascript 放在哪里和函数的绑定方式
一.实验 1:js脚本放在那里最合适? 1.代码 1.1.test.html <!DOCTYPE html><html> <head> < ...
- spring cloud之坑,访问服务时找不到报404
主要是因为: 启动时 而我访问时,api是按照下面这样访问的: 所以报404找不到
- log4j将日志文件输出到相对路径
建议直接使用jvm中定义的变量或者操作系统的环境变量. log4j.appender.logfile.File=${user.dir}/logs/app.log,使用tomcat容器时${user.d ...