牛客練習賽26 C 城市規劃【思維+貪心】
連結 :https://www.nowcoder.com/acm/contest/180/C
來源 :牛客網
城市規劃
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
小a的國家裡有n個城市,其中第i和第i - 1個城市之間有無向道路連線,特殊的,第1個城市僅與第2個城市相連
為了減輕道路維護負擔,城市規劃局局長MXT給出了m個要求,他想讓小a斷開一些道路,使得任意1 ≤ i ≤ m ,城市xi不能到達城市yi
同時最小化斷開道路的數量。
輸入描述:
第一行兩個整數n, m,分別表示城市的數量和請求的數量 接下來m行,每行兩個整數x,y,表示需要使得x不能到達y
輸出描述:
輸出一個整數,表示最小斷開橋的數量
示例1
輸入
4 2
1 3
2 4
輸出
1
說明
可以斷開(2, 3)城市之間的道路
示例2
輸入
4 3
1 3
2 4
1 2
輸出
2
說明
可以斷開(1, 2) (2, 3)之間的道路
備註:
對於100%的資料:n ≤ 106, m ≤ 107
本題不卡常數,請設計嚴格線性做法讀入檔案較大,請使用讀入優化,本機除錯時請使用檔案輸入輸出
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<22, stdin), p1 == p2) ? EOF : *p1++)
char buf[(1 << 22)], *p1 = buf, *p2 = buf;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
用法:
int a = read(), b = read();
std::cout << a + b;由於nowcoder的編譯器限制,如果需要在程式中開107級別的陣列,可能會出現記憶體超限的情況,請使用new函式手動申請
用法:
int* P = new int[(int)1e7 + 10];
題解:首先需要讀入優化。程式flag[y]標記結點y是否在查詢中出現,pos[y]記錄要使y和對應的x斷開至少要從什麼位置之後斷開一條邊,例如x和y分別為1和4,那麼pos[4]=1表明至少要從1編號之後選擇一條邊,由於y值可能相同,因此程式有取pos[y]的較大值的操作。l 記錄上次斷掉的邊的位置,初始化為0,對於當前的y如果pos[y]>=l表明必須再斷掉一條邊才能滿足x和y不連通,此時更新答案和l的值
AC的C++程式碼:
#include<iostream>
using namespace std;
//讀入優化
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<22,stdin),p1 == p2)?EOF:*p1++)
char buf[(1<<22)],*p1=buf,*p2=buf;
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c == '-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c = getchar();}
return x * f;
}
const int N=1000010;
bool flag[N];//標記y出現的位置
int pos[N];//pos[y]記錄要使得y和對應的x斷開至少要在哪個結點編號
int main()
{
int n,m,x,y;
n=read(),m=read();
while(m--){
x=read();
y=read();
flag[y]=true;
pos[y]=max(pos[y],x);
}
//線性掃描
int l=0,ans=0;
for(int i=1;i<=n;i++)
if(flag[i]&&pos[i]>=l){
l=i;
ans++;
}
printf("%d\n",ans);
return 0;
}
相關文章
- 牛客練習賽 26
- 牛客練習賽40 B 小A與任務(貪心)
- 牛客練習賽26 A 平面【遞推】
- 牛客練習賽
- 牛客練習賽60
- 牛客 tokitsukaze and Soldier 貪心
- 牛客練習賽 71 AC
- 牛客 切長條(貪心)
- 牛客練習賽129 A-數數
- 牛客練習賽27【C 水圖 dfs求最長路】
- Find the Maximum - 題解【思維,貪心】
- 牛客周賽 Round 36 (小白練習記)
- 牛客練習賽73 D題:離別
- 【牛客訓練記錄】牛客周賽 Round 69
- 【牛客訓練記錄】牛客周賽 Round 70
- Mysql 練習(牛客網)MySql
- 挑選方案問題(牛客競賽 思維題+推導公式)公式
- LeetCode:動態規劃+貪心題目整理LeetCode動態規劃
- 牛客小白月賽95 (賽前的練習之我是小菜雞)
- 牛客練習賽14B 區間的連續段
- 牛客小白月賽99 C~E
- 牛客SQL練習第21題SQL
- 城市規劃師的新徵程:用資料思維喚醒城市的「智商」與「情商」
- 牛客小白月賽103 A--B--C
- C++奧賽一本通貪心題解C++
- 貪心演算法與動態規劃的區別演算法動態規劃
- 演算法---貪心演算法和動態規劃演算法動態規劃
- 牛客練習賽 37 C 筱瑪的迷陣探險 【折半搜尋+01字典樹】
- 牛客練習賽74 E CCA的期望(算概率的技巧+floyd處理)
- 動態規劃(dynamic programming)與貪心演算法(greedy algorithm)動態規劃演算法Go
- 動態規劃練習題動態規劃
- 牛客周賽48
- 牛客小白月賽15 C 表單 ( map 使用)
- 2020牛客暑期多校訓練營(第三場)D Points Construction Problem 構造思維題Struct
- 「演算法思想」分治、動態規劃、回溯、貪心一鍋燉演算法動態規劃
- 力扣練習-動態規劃力扣動態規劃
- 牛客小白月賽105
- 牛客周賽 Round 63