NOIP模拟 6.30
Problem 1 护花(flower.cpp/c/pas)
【题目描述】
约翰留下他的N(N<=100000)只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时候,他看到了一幕惨剧:牛们正躲在他的花园里,啃食着他心爱的美丽花朵!为了使接下来花朵的损失最小,约翰赶紧采取行动,把牛们送回牛棚. 牛们从1到N编号.第i只牛所在的位置距离牛棚Ti(1≤Ti≤2000000)分钟的路程,而在约翰开始送她回牛棚之前,她每分钟会啃食Di(1≤Di≤100)朵鲜花.无论多么努力,约翰一次只能送一只牛回棚.而运送第第i只牛事实上需要2Ti分钟,因为来回都需要时间. 写一个程序来决定约翰运送奶牛的顺序,使最终被吞食的花朵数量最小.
【输入格式】
第1行输入N,之后N行每行输入两个整数Ti和Di
【输出格式】
一个整数,表示最小数量的花朵被吞食
【样例输入】
6
3 1
2 5
2 3
3 2
4 1
1 6
【样例输出】
86
【样例解释】
约翰用6,2,3,4,1,5的顺序来运送他的奶牛
按D/T排序,证明相邻的交换过来不会比原来更优即可。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
inline void read(long long &x)
{
x = ;char ch = getchar();char c = ch;
while(ch > '' || ch < '')c = ch, ch = getchar();
while(ch <= '' && ch >= '')x = x * + ch - '',ch = getchar();
if(c == '-')x = -x;
}
const long long MAXN = + ;
const int INF = 0x3f3f3f3f; long long n,T[MAXN],D[MAXN],cnt[MAXN]; bool cmp(long long a, long long b)
{
return D[a] * T[b] > D[b] * T[a];
} long long ans;
long long sum; int main()
{
read(n);
for(register long long i = ;i <= n;++ i)
{
read(T[i]);read(D[i]);
cnt[i] = i;
sum += D[i];
}
std::sort(cnt + , cnt + + n, cmp);
for(register long long i = ;i <= n;++ i)
{
sum -= D[cnt[i]];
ans += ((long long)(sum * T[cnt[i]]) << );
}
printf("%lld", ans);
return ;
}
Problem 2 修剪草坪(mowlawn.cpp/c/pas)
【题目描述】
在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在,
新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。
然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这项工作。FJ有N(1 <= N <= 100,000)只排成一排的奶牛,编号为1...N。每只奶牛的效率是不同的,奶牛i的效率为E_i(0 <= E_i <= 1,000,000,000)。靠近的奶牛们很熟悉,因此,如果FJ安排超过K(1<=K<=N)只连续的奶牛,那么,这些奶牛就会罢工去开派对:)。因此,现在FJ需要你的帮助,计算FJ可以得到的最大效率,并且该方案中没有连续的超过K只奶牛。
【输入格式】
* 第一行:空格隔开的两个整数N和K
* 第二到N+1行:第i+1行有一个整数E_i
【输出格式】
* 第一行:一个值,表示FJ可以得到的最大的效率值。
【样例输入】
5 2
1
2
3
4
5
输入解释:
FJ有5只奶牛,他们的效率为1,2,3,4,5。他们希望选取效率总和最大的奶牛,但是
他不能选取超过2只连续的奶牛
【样例输出】
12
FJ可以选择出了第三只以外的其他奶牛,总的效率为1+2+4+5=12。
神奇的dp。
f[i]表示1..i只奶牛不选第i只的最小损耗
初始状态f[0] = 0
转移f[i] = min{f[j]} + e[i],其中(i - j - 1 <= k)
维护一个单调递增队列,从队首取最小元素,新元素加到队尾并维持单调性,每次取队首元素时检查是否合法(即i - j - 1 <= k)
此题开longlong,注意INF的取值,所以以后尽量手写一层,不要用INF
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
inline void read(long long &x)
{
x = ;char ch = getchar();char c = ch;
while(ch > '' || ch < '')c = ch, ch = getchar();
while(ch <= '' && ch >= '')x = x * + ch - '',ch = getchar();
if(c == '-')x = -x;
}
const long long INF = 0x3f3f3f3f3f3f3f3f;
const int MAXN = + ;
inline long long max(long a, long b){return a > b ? a : b;}
inline long long min(long a, long b){return a < b ? a : b;} long long n,k,e[MAXN];
long long ans; long long q1[MAXN << ], q2[MAXN << ],head, tail;
long long f[MAXN]; int main()
{
read(n);read(k);
for(register long long i = ;i <= n;++ i)
read(e[i]),ans += e[i]; head = tail = ;//队列表示的范围:[head,tail]
q1[] = q2[] = ;
for(register int i = ;i <= n;++ i)
{
while(i - q2[head] - > k)head ++;
f[i] = e[i] + q1[head];
while(q1[tail] >= f[i] && head <= tail)tail--;
q1[++ tail] = f[i];
q2[tail] = i;
}
long long tmp = INF;
//最好改为tmp = f[n - k];
for(register int i = n - k;i <= n;++ i)
{
tmp = min(tmp, f[i]);
}
printf("%lld", ans - tmp);
return ;
}
Problem 3 虫洞(wormhole.cpp/c/pas)
【题目描述】
John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地,并有W个虫洞(有向边)。其中1<=N<=500,1<=M<=2500,1<=W<=200。 现在John想借助这些虫洞来回到过去(出发时刻之前),请你告诉他能办到吗。 John将向你提供F(1<=F<=5)个农场的地图。没有小路会耗费你超过10000秒的时间,当然也没有虫洞回帮你回到超过10000秒以前。
【输入格式】
* Line 1: 一个整数 F, 表示农场个数。
* Line 1 of each farm: 三个整数 N, M, W。
* Lines 2..M+1 of each farm: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条用时T秒的小路。
* Lines M+2..M+W+1 of each farm: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条可以使John到达T秒前的虫洞。
【输出格式】
* Lines 1..F: 如果John能在这个农场实现他的目标,输出"YES",否则输出"NO"。
【样例输入】
2
3 3 1
1 2 2
1 3 4
2 3 1
3 1 3
3 2 1
1 2 3
2 3 4
3 1 8
【样例输出】
NO
YES
此虫洞非彼虫洞,明显简单一大截。
SPFA找负环即可,题意描述不够明确。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
inline void read(int &x)
{
x = ;char ch = getchar();char c = ch;
while(ch > '' || ch < '')c = ch, ch = getchar();
while(ch <= '' && ch >= '')x = x * + ch - '',ch = getchar();
if(c == '-')x = -x;
}
inline int max(int a, int b){return a > b ? a : b;}
inline int min(int a, int b){return a < b ? a : b;}
inline void swap(int &a, int &b){int tmp = a;a = b;b = tmp;} const int INF = 0x3f3f3f3f;
const int MAXN = + ;
const int MAXE = + ;
const int MAXW = + ; int t;
int n,m,w; struct Edge
{
int u,v,w,next;
}edge[(MAXE << ) + MAXW];
int head[MAXN],cnt; inline void insert(int a, int b, int c)
{
edge[++cnt] = Edge{a,b,c,head[a]};
head[a] = cnt;
} std::queue<int> q;
int b[MAXN], d[MAXN], cot[MAXN]; inline int SPFA(int s)
{
memset(b, , sizeof(b));
memset(d, 0x3f, sizeof(d));
memset(cot, , sizeof(cot));
q.push(s);
d[s] = ;
b[s] = true;
cot[s] ++;
register int u,v;
while(!q.empty())
{
u = q.front();
q.pop();
b[u] = false;
for(register int pos = head[u];pos;pos = edge[pos].next)
{
v = edge[pos].v;
if(d[v] > d[u] + edge[pos].w)
{
d[v] = d[u] + edge[pos].w;
if(!b[v])
{
b[v] = true;
q.push(v);
cot[v] ++;
if(cot[v] >= n)return ;
}
}
}
}
return ;
} int main()
{
read(t);
register int tmp1,tmp2,tmp3;
for(;t;--t)
{
read(n);read(m);read(w);
memset(edge, , sizeof(edge));
memset(head, , sizeof(head));
cnt = ;
for(register int i = ;i <= m;++ i)
{
read(tmp1);read(tmp2);read(tmp3);
insert(tmp1, tmp2, tmp3);
insert(tmp2, tmp1, tmp3);
}
for(register int i = ;i <= w;i ++)
{
read(tmp1);read(tmp2);read(tmp3);
insert(tmp1, tmp2, - * tmp3);
}
if(!SPFA())
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return ;
}
T4暴力模拟没意思。。。不上了
NOIP模拟 6.30的更多相关文章
- noip模拟测试30
考试总结:这次考试,不是很顺利,首先看了一眼题目,觉得先做T1,想了一会觉得没什么好思路,就去打暴力,结果我不会枚举子集,码了半天发现不对,就随便交了一份代码上去,结果CE了,然后去打T3,20min ...
- [NOIP模拟测试30]题解
A.Return 出题人大概是怕自己的中文十级没人知道,所以写了这么一个***题面.可能又觉得这题太水怕全场A掉后自己面子过不去,于是又故意把输出格式说的含糊不清.(鬼知道"那么输出-1&q ...
- NOIP模拟测试30「return·one·magic」
magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...
- noip模拟30[毛毛毛探探探]
\(noip模拟30\;solutions\) 所以说,这次被初中的大神给爆了????? 其实真的不甘心,这次考场上的遗憾太多,浪费的时间过多,心情非常不好 用这篇题解来结束这场让人伤心的考试吧 \( ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- CH Round #48 - Streaming #3 (NOIP模拟赛Day1)
A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...
- 11.7 NOIP模拟赛
目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...
随机推荐
- nginx 安装配置信息
#user nobody;worker_processes 1; #error_log logs/error.log;#error_log logs/error.log notice;#error_l ...
- PAT甲级——A1102 Invert a Binary Tree
The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...
- fftw3.3.3在redhat4.4下安装
FFTW ( the Faster Fourier Transform in the West) 是一个快速计算离散傅里叶变换的标准C语言程序集,其由MIT的M.Frigo 和S. Johnson 开 ...
- 07_Spring事务处理
一.事务概述 数据库的事务: 事务是一组操作的执行单元,相对于数据库操作来讲,事务管理的是一组SQL指令,比如增加,修改,删除等.事务的一致性,要求,这个事务内的操作必须全部执行成功,如果在此过程种出 ...
- 表格Table好看的样式表
caption { padding: 0 0 5px 0; width: 700px; font: italic 11px "Trebuchet MS" , Verdana, Ar ...
- Hyper-V 2016 上安装windows7激活重启后黑屏无法进入系统
激活重启后就出现下图,无法进入系统 出现此种情况是由于win7的开机引导损坏导致的,具体解决办法如下: 1.设置光盘启动 2.关闭系统重新启动进行修复 启动后按住shift+f10进行修复 输入以下命 ...
- 廖雪峰Java11多线程编程-2线程同步-1同步代码块
1.线程安全问题 多个线程同时运行,线程调度由操作系统决定,程序本身无法决定 如果多个线程同时读写共享变量,就可能出现问题 class AddThread extends Thread{ public ...
- 第二章 Odoo 12开发之开发环境准备
在更深入了解 Odoo 开发之前,我们应配置好开发环境并学习相关的基础管理任务.本文中,我们将学习创建 Odoo 应用所需用到的工具和环境配置.这里采用 Ubuntu 系统来作为开发服务器实例的主机, ...
- light oj 1037 状压dp
#include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...
- PHP中的符号 ->、=> 和 :: 的含义(用法)
php新手经常碰到的问题,->.=> 和 :: 这三个家伙是什么分别都是做什么的啊!看着就很晕. 没关系,下面我们做一下详细的解释,如果你有C++,Perl基础,你会发现这些家伙和他们里面 ...