2017.07.06【NOIP提高组】模拟赛B组小结

T1:  FJ出去砍木材去了,把N(2<=N<=100,000)头牛留在家中吃草,当他回来的时候,发现奶牛们都跑到花园里吃花去了,为了减少损失,FJ打算把牛移到牛棚中去。  每头牛的位置离牛棚需要Ti分钟(1<=Ti<=2,000,000),而且在等待被移走的过程中,每分钟破坏Di(1<=Di<=100)朵花,无论多么努力FJ一次只能移动一只奶牛,移动一只奶牛到牛棚需要2×Ti分钟(来回各一次)。  写一个程序安排移动顺序使得损失的花最少。

Input  第1行输入一个整数N  第

2到N+1行每行包含两个整数Ti和Di

Output  输出一个整数表示最少损失的花的数量Sample 

Input63 12 52 33 24 11 6

【样例说明】FJ按照6、2、3、4、1、5的顺序移走奶牛

想法: 推不等式设第一头牛时间为a,价格为b 第二头牛时间为c,价格为d,

则必有2ad<<2bc

ad<bc

a<bc/d

a/b<c/d

多头牛同理

所以把时间/价格从小到大排序即可

T2:最高的奶牛Description  FJ有N(1 <= N <= 10,000)头奶牛,编号为1到N,站成一条直线。每头奶牛自己的身高(正整数,秘密未知),告诉你最高奶牛的身高H及位置I,同时告诉你R(0 <= R <= 10,000)组信息,每组信息由两个数ai,bi组成,表示奶牛ai可以看到奶牛bi,这就意味着奶牛bi的身高至少和奶牛ai的身高一样高,同时奶牛ai到奶牛bi之间的奶牛身高必须低于奶牛ai  现在要你求出每头奶牛最高可能的高度,保证有解。

Input  第1行输入4个空格隔开的整数N,I,H,R  

第2到R+1行,每行两个空格隔开的不同的整数A,B(1<=A,B<=N),表示奶牛A能看到奶牛B

Output  第1到N行,每行一个整数表示每只奶牛最高可能的高度。

Sample Input9 3 5 51 35 34 33 79 8

Sample 

Output

5

4

5

3

4

4

5

5

5

想法:

设每头牛起始高度为h,则每个关系令l+1~r-1的牛高度-1,注意(l,r)去重,

T3:排队Description  

每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛.但是为了避免水平悬殊,牛的身高不应该相差太大.  

John 准备了Q (1 <= Q <= 180,000) 个可能的牛的选择和所有牛的身高 (1 <=身高 <= 1,000,000). 他想知道每一组里面最高和最低的牛的身高差别.Input  

第一行: N 和 Q.  

第2..N+1行: 第i+1行是第i头牛的身高.  

第N+2..N+Q+1行: 两个整数, A 和 B (1 <= A <= B <= N), 表示从A到B的所有牛.

Output  

第1..Q行: 所有询问的回答 (最高和最低的牛的身高差), 每行一个.

Sample Input6 3

1

7

3

4

2

5

1 5

4 6

2 2

想法: 线段树维护区间最大最小值即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述: 给定两支队伍的比分,已知每一局比的胜负,求哪支队伍可能获得这场比的胜利。 规则如下: - 比共进行 $n$ 局,每局比要么由一支队伍获胜,要么由另一支队伍获胜,不可能出现平局。 - 获得比胜利的队伍必须在 $n$ 局比中获胜至少 $\left\lceil\frac{n}{2}\right\rceil$ 局。 输入格式: - 第一行一个整数 $n$,表示比总共进行了 $n$ 局 $(1≤n≤100)$。 - 第二行一个整数 $a$,表示第一支队伍得分 $(0≤a≤n)$。 - 第三行一个整数 $b$,表示第二支队伍得分 $(0≤b≤n)$。 - 接下来 $n$ 行,每行给出一局比的结果,用 0 表示第一支队伍获胜,用 1 表示第二支队伍获胜。 输出格式: - 如果第一支队伍可能获得比胜利,则输出 0。 - 如果第二支队伍可能获得比胜利,则输出 1。 - 如果两支队伍都有可能获得比胜利,则输出 -1。 思路分析: 根据题目描述,我们可以得知,获得比胜利的队伍必须获胜至少 $\left\lceil\frac{n}{2}\right\rceil$ 局,因此,我们需要统计两支队伍分别获胜的局数。 对于一局比,如果第一支队伍获胜,则将第一支队伍的胜利局数加一,如果第二支队伍获胜,则将第二支队伍的胜利局数加一。 统计完两支队伍分别获胜的局数后,判断哪支队伍可能获得比胜利即可。 代码实现: 时间复杂度:$O(n)$ 空间复杂度:$O(1)$ ```c #include <stdio.h> int main() { int n, a, b; scanf("%d%d%d", &n, &a, &b); int cnta = 0, cntb = 0; for (int i = 1; i <= n; i ++ ) { int x; scanf("%d", &x); if (x == 0) cnta ++ ; else cntb ++ ; } int m = (n + 1) / 2; if (a + cnta >= m && b + cntb < m) printf("0\n"); else if (b + cntb >= m && a + cnta < m) printf("1\n"); else printf("-1\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值