2019 年百度之星·程序设计大赛 - 初赛一Game HDU 6669 (实现,贪心)
Game
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 833 Accepted Submission(s): 200
Problem Description
度度熊在玩一個好玩的游戲。
游戲的主人公站在一根數軸上,他可以在數軸上任意移動,對于每次移動,他可以選擇往左或往右走一格或兩格。
現在他要依次完成 n 個任務,對于任務 i,只要他處于區間 [ai,bi] 上,就算完成了任務。
度度熊想知道,為了完成所有的任務,最少需要移動多少次?
度度熊可以任意選擇初始位置。
Input
第一行一個整數 T (1≤T≤10) 表示數據組數。
對于每組數據,第一行一個整數 n (1≤n≤1000) 表示任務數。
接下來 n 行,第 i 行兩個整數 ai,bi (1≤ai≤bi≤1000000) 表示任務對應的區間。
Output
對于每組數據,一行一個整數表示答案。
Sample Input
1
2
1 10
20 30
Sample Output
5
樣例描述
選取10為起點,經過的軌跡為10-12-14-16-18-20。
Source
2019 年百度之星·程序設計大賽 - 初賽一
思路:
由于題目要求一次完成n個任務, 所以先把給定的n個區間,縮并為cnt個不相交的區間,那么就從第一個依次貪心的進入每一個區間,
用第二個 區間和第一個區間的位置關系,判斷初始位置,
當從當前now移動到第i個區間需要移動的距離是奇數時,根據第i+1(如果存在的話)來判斷是否需要多跳一個位置即可。
細節見代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #include <iomanip> #define ALL(x) (x).begin(), (x).end() #define sz(a) int(a.size()) #define all(a) a.begin(), a.end() #define rep(i,x,n) for(int i=x;i<n;i++) #define repd(i,x,n) for(int i=x;i<=n;i++) #define pii pair<int,int> #define pll pair<long long ,long long> #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define MS0(X) memset((X), 0, sizeof((X))) #define MSC0(X) memset((X), '\0', sizeof((X))) #define pb push_back #define mp make_pair #define fi first #define se second #define eps 1e-6 #define gg(x) getInt(&x) #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl using namespace std; typedef long long ll; ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;} ll lcm(ll a, ll b) {return a / gcd(a, b) * b;} ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2) { ans = ans * a % MOD; } a = a * a % MOD; b /= 2;} return ans;} inline void getInt(int *p); const int maxn = 100010; const int inf = 0x3f3f3f3f; /*** TEMPLATE CODE * * STARTS HERE ***/ pii a[maxn]; pii b[maxn]; int cnt; int n; int main() {//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);int t;gbtb;cin >> t;while (t--) {cnt=0;cin >> n;repd(i, 1, n) {cin >> a[i].fi >> a[i].se;}b[++cnt]=a[1];repd(i,2,n){if(a[i].fi>b[cnt].se){b[++cnt]=a[i];}else if(a[i].se<b[cnt].fi){b[++cnt]=a[i];}else{b[cnt].fi=max(b[cnt].fi,a[i].fi);b[cnt].se=min(b[cnt].se,a[i].se);}}if(cnt==1){cout<<0<<endl;// 只有一個區間,直接特判出0continue;}int ans=0;int now;// 當前的位置if(b[2].fi>b[1].se){now=b[1].se;}else{now=b[1].fi;}repd(i,2,cnt){int dis;// 需要移動的距離if(b[i].fi>now){dis=b[i].fi-now;if(dis&1){if(i+1<=cnt&&(b[i].se-b[i].fi)>1&&b[i+1].fi>b[i].fi){now=b[i].fi+1;}else{now=b[i].fi;}}else{now=b[i].fi;}ans+=dis/2;if(dis&1){ans++;}}else{dis=now-b[i].se;if(dis&1){if(i+1<=cnt&&(b[i].se-b[i].fi)>1&&b[i+1].se<b[i].se){now=b[i].se-1;}else{now=b[i].se;}}else{now=b[i].se;}ans+=dis/2;if(dis&1){ans++;}}}cout<<ans<<endl;}return 0; }inline void getInt(int *p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}} else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}} }轉載于:https://www.cnblogs.com/qieqiemin/p/11374051.html
總結
以上是生活随笔為你收集整理的2019 年百度之星·程序设计大赛 - 初赛一Game HDU 6669 (实现,贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 坦克大战 Java版
- 下一篇: HDU1029