P3-2017级算法第三次上机 B SkyLee逛漫展
题目描述
求数组中数字xx所在的位置(保证数组严格递增)
输入
多组数据输入
第一行一个整数nn,为数组元素个数(1<n<=1e6)
第二行nn个整数,为数组元素
第三行一个整数,为请求查询的次数tt(1<t<=1e6)
第四行tt个整数,分别为要求查找的数字xx(保证数组元素和x在int范围内)
输出
对于每组数据,输出一行,为按照请求查询的顺序的xx在数组中的位置pp
输入样例
5
1 2 3 4 5
3
1 3 5
输出样例
1 3 5
思路
没什么好说的。
参考代码
题目描述
SkyLee趁着假期来逛漫展,漫展只有一条通道,只能从入口进入,出口离开,且左边有n个店铺,右边也有n个店铺,编号都是1~n。为了照顾大家没法兼顾逛两边的痛苦,左边和右边编号相同的店铺卖同样的周边。
现在SkyLee站在入口处的路中间,立志要从头到尾按顺序逛完所有的店铺。
因为每家店铺排队的人数不同,SkyLee在左边第i家要停留 p1[i] 的时间,在右边第i家要停留 p2[i] 的时间。而且这条路还挺宽的,所以从左边第i家移动到右边第i+1家需要t[1][i]的时间;从右边第i家移动到左边第i+1家需要t[2][i]的时间。
由于时间安排的紧,SkyLee想知道逛完漫展至少需要多长时间。
开始时从路中间到任意一边的时间以及同一边相邻店铺移动时间忽略不计。
输入
多组数据输入
对于每一组测试数据,第一行11个数nn (0<=n<=500)表示店铺数。
接下来一行nn 个数,表示在左边店铺停留时间p1p1 。再接下来一行nn个数,表示在右边店铺停留时间p2p2 (0<=p1,p2<=1000)。
接下来22行,每行n−1n−1个数,分别表示t[1][i]t[1][i] 和t[2][i]t[2][i] (0<=t<=300)。
输出
对于每组数据,输出一行,为最少时间TT。
输入样例
3
10 1 10
8 5 10
3 1
1 3
输出样例
20
思路
两条流水线的ALS。
很暴力地从头到尾遍历两条流水线,求出达到两条流水线上每一个工序所需地最短时间,每个工序的时间在进行累加时选取从当前流水线继续加工和从另一条流水线切换到当前流水线中较小的,一直到最后一个工序,判断最后达到哪条流水线所需的时间最少。
由于只有两条流水线,且只遍历一次流水线,因此时间复杂度为O(N)。
参考代码
1 #include<stdio.h> 2 #define MAXN 501 3 int p1[MAXN],p2[MAXN];//当前店铺停留时间 4 int t1[MAXN],t2[MAXN];//t1[i]:从左边第i家到右边第i+1家所需的移动时间 5 int f[2][MAXN];//记录数组 6 int Min(int a,int b); 7 int main() 8 { 9 int n;//店铺数 10 while(scanf("%d",&n) == 1){ 11 int i; 12 for(i = 1;i <= n;i++) 13 scanf("%d",&p1[i]); 14 for(i = 1;i <= n;i++) 15 scanf("%d",&p2[i]); 16 for(i = 1;i <= n-1;i++) 17 scanf("%d",&t1[i]); 18 for(i = 1;i <= n-1;i++) 19 scanf("%d",&t2[i]); 20 //初始化 21 f[0][1] = p1[1]; 22 f[1][1] = p2[1]; 23 //状态转移 24 int j; 25 for(j = 2;j <= n;j++){ 26 f[0][j] = Min(f[0][j-1]+p1[j],f[1][j-1]+t2[j-1]+p1[j]); 27 f[1][j] = Min(f[1][j-1]+p2[j],f[0][j-1]+t1[j-1]+p2[j]); 28 } 29 if(f[0][n] >= f[1][n]) 30 printf("%d\n",f[1][n]); 31 else 32 printf("%d\n",f[0][n]); 33 } 34 } 35 36 int Min(int a,int b) 37 { 38 if(a < b) 39 return a; 40 else 41 return b; 42 }