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

本文解析了三个算法题目,包括计算特定条件下的总武力值、统计符合规则的队伍排列数量及解决序列问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

T1jzoj1273. 袁绍的刁难

Description

  黄巾之乱后,郭嘉到了袁绍的统辖地区,结果袁绍想给我们的郭嘉大大一个下马威,且正值他招募将领的时候,于是乎,袁绍就让郭嘉大大去替他招募将领。
  这时候有很多很多的将领到袁绍处报到(别人家底厚,四世三公哪~~),每个将领的编号依次为1、2、3……N,第i个将领的武力值为3^(i-1)。
  袁绍需要我们的郭嘉大大招纳任意个将领,而郭嘉选中的将领有一个“总武力值”为各个将领的武力值之和。例如:郭嘉这一次招募了第一个将领和第三个将领,那么“总武力值”为1+9=10。
  袁绍想知道,他可以获得的第k大的“总武力值”是多少,请你帮助我们的郭嘉大大告诉袁绍这个第k大的“总武力值”。
  从文件中读入k,输出郭嘉能够获得的,第k大的“总武力值”。

Input

 数据包含n+1行,第一行读入n(n≤100)。以下n行每行包含一个k。

Output

 输出包含n行,每行输出一个对应的结果。

Sample Input

1
7

Sample Output

13
想法:
很明显,对于3^x插入序列时,会跟原序列的每个数相加得到新的序列,其实只要把k二进制一下,从后往前的第i位有1的话,答案加上3^(i-1)

T2jzoj5230. 【NOIP2017模拟A组模拟8.5】队伍统计

Description

现在有n个人要排成一列,编号为1->n 。但由于一些不明原因的关系,人与人之间可能存在一些矛盾关系,具体有m条矛盾关系(u,v),表示编号为u的人想要排在编号为v的人前面。要使得队伍和谐,最多不能违背k条矛盾关系(即不能有超过k条矛盾关系(u,v),满足最后v排在了u前面)。问有多少合法的排列。答案对10^9+7取模。

Input

输入文件名为count.in。
第一行包括三个整数n,m,k。
接下来m行,每行两个整数u,v,描述一个矛盾关系(u,v)。
保证不存在两对矛盾关系(u,v),(x,y),使得u=x且v=y 。

Output

输出文件名为count.out。
输出包括一行表示合法的排列数。

Sample Input

输入1:
4 2 1
1 3
4 2

输入2:
10 12 3
2 6
6 10
1 7
4 1
6 1
2 4
7 6
1 4
10 4
10 9
5 9
8 10

Sample Output

输出1:
18

输出2:
123120

Data Constraint

对于30%的数据,n<=10
对于60%的数据,n<=15
对应100%的数据,n,k<=20,m<=n*(n-1),保证矛盾关系不重复。
想法:
状压DP
设f[s][i]表示选的人状态为j,违反了i条规则的方案数
设fal[v]表示v的二进制下有多少个1
设a[v]为应该在v后的人的状态
设从队尾插入j这个人
f[(1《《j-1)+s][i+fal[a[j]&s]]+=f[s][i];
答案为f[(1《《n)-1][0~k]

T3jzoj5231. 【NOIP2017模拟A组模拟8.5】序列问题

Description
这里写图片描述
Input

输入文件名为seq.in。
首先输入n。
接下来输入n个数,描述序列 A。

Output

输出文件名为seq.out。
输出一行一个整数代表答案。

Sample Input

7
0 35 40 45 56 65 94

Sample Output

66636

Data Constraint

对于30%的数据,n<=5000
对于60%的数据,n<=50000
对于100%的数据,n<=500000,0<=A[i]<=10^9
想法:
设求区间[l,r]的答案
递归求出[l,mid]和[mid+1,r]的答案
左端点和右端点在同一半区间的求出来了,剩下在不同区间
从mid到l倒序枚举左端点,设min1为min(a[i~mid]),max1同理
设min2[j]为min(a[mid+1~j]),max2同理
利用这个二分出min’(比min小)和max’(比max大)的位置
那么右区间可分三段处理,找不到min’和max’就减一段
设sum1[j]为sigma(min2[mid+1~j])
sum2[j]为sigma(max2[mid+1~j])
sum3[j]为sigma(max2[k]*min2[k])k=(mid+1~j)
做一个前缀和
设min’位置为x,max’为y
设x《y
区间mid+1~x-1,min值定,max值定,ans+=max*min*(x-1-mid)
区间x~y-1,min值不定,max值定,ans+=max*(sum1[y-1]-sum1[x-1])
区间y~r,min值不定,max值不定,ans+=sum3[r]-sum3[y-1]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值