日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Division 贪心,模拟 牛客练习赛95

發布時間:2025/3/19 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Division 贪心,模拟 牛客练习赛95 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:https://ac.nowcoder.com/acm/contest/11185/C
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
Special Judge, 64bit IO Format: %lld
題目描述
給出一個正整數序列 [a_1\dots a_n][a
1
?
…a
n
?
] 以及定值 kk,每次可以選擇一個區間 [l,r]\ (r-l+1\ge k)[l,r] (r?l+1≥k),把這個區間內的 a_ia
i
?
除以二下取整。是否可能通過一些操作,把所有 a_ia
i
?
變成 11?

若能,求出一種操作次數最少的操作方案。若有多種方案,可以輸出任意一種。
輸入描述:
本題有多組數據。

第一行是數據組數 TT。(1\le T\le 2000)(1≤T≤2000)

每組數據中:

第一行兩個正整數 n,kn,k。(1\le k\le n\le 10^4)(1≤k≤n≤10
4
)

接下來一行 nn 個正整數 a_1\sim a_na
1
?
~a
n
?
。(1\le a_i\le 10^{15})(1≤a
i
?
≤10
15
)

同一個測試點內,所有數據中 nn 的和不超過 2\times 10^42×10
4

輸出描述:
對于每組數據:

若無解,輸出 -1。

若有解,第一行輸出最小操作次數 mm。

接下來 mm 行每行兩個正整數 l,rl,r,代表對 [l,r][l,r] 進行一次操作。(1\le l\le r\le n)(1≤l≤r≤n)
示例1
輸入
復制
2
5 3
3 3 5 3 3
5 3
3 3 3 5 3
輸出
復制
2
1 3
3 5
-1

思路 :

  • 首先將原數組轉化一下,問題就轉化為將新的數組中每個元素值都變為0
  • 為了使操作次數最少,對于每一個左端點,枚舉貪心最優的右端點,選一個盡可能大的 非遞減 的區間,然后將它們值都減一,作為一次操作
#include <iostream> #include <cstring> using namespace std;typedef long long ll;const int N = 1e4 + 10, M = 1e6 + 10;int a[N]; int ansl[M], ansr[M], cnt;void solve() {int n, k; cin >> n >> k; // memset(a, 0, sizeof a);for (int i = 1; i <= n; i ++ ){ll x; cin >> x;a[i] = 0;while (x > 1) x >>= 1, a[i] ++ ;}int l, r;cnt = 0;for (l = 1; l <= n; ){if (!a[l]) l ++ ;else{for (r = l; r <= n && a[r] >= a[r - 1]; r ++ );if (r - 1 - l + 1 < k){cout << -1 << endl;return ;}for (int i = l; i <= r - 1; i ++ ) a[i] -- ;ansl[ ++ cnt] = l, ansr[cnt] = r - 1;}}cout << cnt << endl;for (int i = 1; i <= cnt; i ++ ) cout << ansl[i] << ' ' << ansr[i] << endl; }int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _; cin >> _;while (_ -- )solve(); }

總結

以上是生活随笔為你收集整理的Division 贪心,模拟 牛客练习赛95的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。