蓝桥杯官网 试题 PREV-278 历届真题 双向排序【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯官网 试题 PREV-278 历届真题 双向排序【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為幫助大家能在6月18日的比賽中有一個更好的成績,我會將藍橋杯官網上的歷屆決賽題目的四類語言題解都發出來。希望能對大家的成績有所幫助。
今年的最大目標就是能為【一億技術人】創造更高的價值。
資源限制
內存限制:256.0MB C/C++時間限制:1.0s Java時間限制:3.0s Python時間限制:5.0s
C++
#include<stdio.h> #include<algorithm>#define N 100010 #define x first #define y secondusing namespace std;typedef pair<int,int> PIT;PIT req[N]; int ans[N];int main() {int n,m;int i,j;int top;int p,q;int k,l,r;while(scanf("%d %d",&n,&m)==2){top = 0;for(i=0;i<m;i++){scanf("%d %d",&p,&q);if(!p) // 操作0{while(top && req[top].x == 0) // 如果出現連續的0操作,則記錄最大的操作范圍 q = max(q,req[top--].y);while(top >= 2 && req[top-1].y <= q) // 如果當前操作的范圍比上一次的操作范圍大,則把上一次的0和1操作刪除top -= 2;req[++top] = {0,q}; // 保存最優的操作 } else if(top) //操作1 && 操作0已經進行過,因為第一個操作是1的話無意義{while(top && req[top].x == 1) //如果是連續的1操作,則記錄最大的操作范圍q = min(q,req[top--].y) ; // 因為是給后綴排序,q越小,操作的范圍越大while(top >= 2 && req[top-1].y >= q) top -= 2;req[++top] = {1,q};} }k = n;l = 1;r = n;for(i=1;i<=top;i++){if(req[i].x == 0) // 操作0{while(l <= r && r > req[i].y) ans[r--] = k--;} else // 操作1 {while(l <= r && l < req[i].y)ans[l++] = k--;}if(l > r) break;}if(top % 2) // 操作1{while(l <= r)ans[l++] = k--;} else // 操作0 {while(l <= r)ans[r--] = k--;}for(i=1;i<=n;i++){printf("%d ",ans[i]);}printf("\n");}return 0; }C
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>#define x first #define y secondtypedef struct{int x;int y; }PII;const int N = 100010;int main() {int n, m; PII stk[N]; int ans[N];int i , j ;scanf("%d%d", &n, &m);int top = 0;while (m -- ){int p, q;scanf("%d%d", &p, &q);if (!p)//操作1 {while (top && stk[top].x == 0) q = fmax(q, stk[top -- ].y);//出現連續的操作1,我們取最大 while (top >= 2 && stk[top - 1].y <= q) //如果當前的操作1比上一次的操作1范圍大,則將上一次操作1和操作2刪除 top -= 2;PII num;num.x = 0;num.y = q;stk[ ++ top] = num;//存本次最佳操作 }else if (top)//操作2 &&且操作1已經進行過(操作二第一個用沒效果) {while (top && stk[top].x == 1) q = fmin(q, stk[top -- ].y);while (top >= 2 && stk[top - 1].y >= q) top -= 2;PII num;num.x = 1;num.y = q;stk[ ++ top] = num;}}int k = n, l = 1, r = n;for (i = 1; i <= top; i ++ ){if (stk[i].x == 0)//如果是操作1 while (r > stk[i].y && l <= r) ans[r -- ] = k -- ;//移動r值 ,并賦值 elsewhile (l < stk[i].y && l <= r) ans[l ++ ] = k -- ; if (l > r) break;}if (top % 2)while (l <= r) ans[l ++ ] = k -- ;elsewhile (l <= r) ans[r -- ] = k -- ;for (i = 1; i <= n; i ++ )printf("%d ", ans[i]);return 0; }Java
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StreamTokenizer; public class Main {public static void main(String[]args) throws IOException{int n=in();int m=in();int[]sta=new int[m];int cnt=0;while(m-->0){int op=in();int mid=in();{//維護棧if(op==0){if(cnt%2!=op)//如果要放入的指令與棧中最后一個指令類型相同{if(cnt-1>=0&&sta[cnt-1]<=mid)cnt--;//則進行第一輪比較,如果當前更大則彈出最后一個else continue;//否則直接舍去當前指令,進入下一層循環}while(cnt-2>=0&&sta[cnt-2]<=mid) cnt-=2;//循環彈出}else{if(cnt%2!=op)//如果要放入的指令與棧中最后一個指令類型相同{if(cnt-1>=0&&sta[cnt-1]>=mid)cnt--;//則進行第一輪比較,如果當前更小則彈出最后一個else continue;//否則直接舍去當前指令,進入下一層循環}while(cnt-2>=0&&sta[cnt-2]>=mid) cnt-=2;//循環彈出}sta[cnt++]=mid;//壓入棧}}int l=1;int r=n;int[] ans=new int[n+1];//x從大到小,從外到內填數字int x=n;for(int i=0;i<cnt;i++){int mid=sta[i];if(i%2==1){mid=Math.min(r, mid);while(l<mid)ans[l++]=x--;}else {mid=Math.max(l, mid);while(r>mid)ans[r--]=x--;}if(r-l<1)break;}if(l<=r)if(cnt%2==1) {while(l<=r)ans[l++]=x--;}else {while(l<=r)ans[r--]=x--;}out.print(ans[1]);for(int i=2;i<=n;i++) {out.print(" "+ans[i]);}out.println();out.flush();}static StreamTokenizer in=new StreamTokenizer (new BufferedReader(new InputStreamReader(System.in)));static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));static int in() throws IOException{in.nextToken();return(int)in.nval;} }Python
# -*- coding: utf-8 -*-read = lambda tp: map(tp, input().split())def solve():n, m = read(int)ops = []for _ in range(m):p, q = read(int)if not p:while ops and ops[-1][0] == 0:q = max(ops.pop()[1], q)while len(ops) >= 2 and ops[-2][1] <= q:ops.pop(), ops.pop()ops.append([0, q])elif ops:while ops and ops[-1][0] == 1:q = min(ops.pop()[1], q)while len(ops) >= 2 and ops[-2][1] >= q:ops.pop(), ops.pop()ops.append([1, q])ans = [0] * (n + 1)k, l, r = n, 1, nfor p, q in ops:if not p:while l <= r and r > q:ans[r] = kr -= 1k -= 1else:while l <= r and l < q:ans[l] = kl += 1k -= 1if l > r:breakif len(ops) % 2:while l <= r:ans[l] = kl += 1k -= 1else:while l <= r:ans[r] = kr -= 1k -= 1print(*ans[1:], sep=' ')if __name__ == '__main__':while True:try:solve()except EOFError:break總結
以上是生活随笔為你收集整理的蓝桥杯官网 试题 PREV-278 历届真题 双向排序【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D脚本学习1
- 下一篇: 帧差法——动态检测——统计车流量