【模拟】签订协议(nowcoder 217601)
生活随笔
收集整理的這篇文章主要介紹了
【模拟】签订协议(nowcoder 217601)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簽訂協議
nowcoder 217601
題目大意
給出n個數,現在有一個協議書,讓你從1傳到n,然后傳回1,繼續傳下去
對于第i個數,如果前面i-1個數已經匹配過了,那么當協議書傳過來時即可匹配,否則無法匹配
我讓你讓所有數匹配最少傳多少圈(向上取整)
輸入樣例#1
5 1 5 8 4 3輸出樣例#1
3輸入樣例#2
10 11 8 5 7 1 6 2 3 4 10輸出樣例#2
6樣例解釋#1
第一輪:8
第二輪:5 4 3
第三輪:1
數據范圍
1?n?8×1051?ai?1061\leqslant n \leqslant 8 \times 10^5\\1\leqslant a_i\leqslant 10^61?n?8×1051?ai??106
解題思路
如果直接暴力枚舉會TLE
當匹配完值為iii的點后需要匹配值為i+1i+1i+1的點
那么可以按aia_iai?排序,這樣得到匹配的數的順序
設viv_ivi?為當前數的初始位置
如果vi>vi?1v_i>v_{i-1}vi?>vi?1?那么不用多傳一圈
否則要多傳一圈
代碼
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; int n, ans; struct node {int v, s; }a[800010]; bool cmp(node x, node y) {return x.s > y.s;//按給出的值排序 } int main() {scanf("%d", &n);for (int i = 1; i <= n; ++i){scanf("%d", &a[i].s);a[i].v = i;//記錄初始位置}sort(a + 1, a + 1 + n, cmp);//排序for (int i = 2; i <= n; ++i)if (a[i].v < a[i - 1].v)//要多傳一圈ans++;ans++;//不滿一圈的printf("%d", ans);return 0; }總結
以上是生活随笔為你收集整理的【模拟】签订协议(nowcoder 217601)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10系统如何切换独立显卡如何设置电
- 下一篇: 你见过哪些亚马逊的坑亚马逊都有哪些坑