生活随笔
收集整理的這篇文章主要介紹了
Acwing第 2 场周赛【完结】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
做了兩道,看了一下第三道題目直接撤了,不過第三道題目好像之前在哪見過。
好像是個原題,不過還是不會。
目錄
- A: 3626. 三元一次方程 【難度: 簡單 / 知識點: 暴力】
- B: 3627. 最大差值 【難度: 簡單 / 知識點: 貪心】
- C: 3628. 邊的刪減 【難度: 中等 / 知識點: 最短路徑樹】
A: 3626. 三元一次方程 【難度: 簡單 / 知識點: 暴力】
題目地址
這道題居然花費了我十分鐘左右,題目數據范圍很小直接三重循環(huán)暴力就行。
剛開始想復雜了,花費了不少時間,當看到2分鐘就有人AC的時候,我知道了這絕對是一個簽到。
果斷轉換思維,打暴力。
#include<bits/stdc++.h>
using namespace std
;
int main(void)
{int t
; cin
>>t
;while(t
--){int n
; cin
>>n
;bool flag
=false;for(int i
=0;i
<=350;i
++){for(int j
=0;j
<=200;j
++){for(int z
=0;z
<=200;z
++){if(i
*3+j
*5+z
*7==n
){cout
<<i
<<" "<<j
<<" "<<z
<<endl
;flag
=1;}if(flag
) break;}if(flag
) break;}if(flag
) break;}if(!flag
) cout
<<-1<<endl
;}return 0;
}
B: 3627. 最大差值 【難度: 簡單 / 知識點: 貪心】
題目地址
#include<bits/stdc++.h>
using namespace std
;
typedef long long int LL
;
const int N
=1e5*2+10;
LL a
[N
];
int main(void)
{int t
; cin
>>t
;while(t
--){int n
,k
; cin
>>n
>>k
;LL sum
=0;for(int i
=1;i
<=n
;i
++) cin
>>a
[i
];sort(a
+1,a
+n
+1);for(int i
=n
-k
;i
<=n
;i
++) sum
+=a
[i
];cout
<<sum
<<endl
;}return 0;
}
C: 3628. 邊的刪減 【難度: 中等 / 知識點: 最短路徑樹】
題目地址
在講解題目之前,需要直到的前置知識:
- 最短路徑的概念: 一個指定的頂點出發(fā),計算從該頂點出發(fā)到其他所有頂點的最短路徑。
- 最小生成樹(Minimum Spanning Tree)簡稱MST: 有n個點我們選n-1條邊可以將所有的點聯通,且其權值之和最小。
- 最短路徑樹(Shortest Path Tree)簡稱SPT: 是一種使用最短路徑算法生成的數據結構樹。
- 所謂最短路徑樹,就是對于給定的源點 ,求出它到所有結點的最短路徑,并且通過前驅來標記每個結點是從哪個結點過來的,如果有多 條長度相等的最短路徑時,取其中一條,這樣整個圖就變成了一棵以源點為根結點的樹,這棵樹就叫最短路徑樹。
- 需要注意的是,最短路徑樹是原圖的一棵生成樹,并且要求原圖一定是一個連通圖。
本題考察的知識點就是最短路經樹,大致思路跑一遍的Dijkstra()求出來,各個點到1的最短距離。
遍歷一下圖,找到一個最多保留k條邊的最短路樹,那么我們的最優(yōu)狀態(tài)是k+1個點。
如果 dist[b]=dist[a]+w說明這是一條最短路上的邊。
y總代碼:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>#define x first
#define y secondusing namespace std
;typedef long long LL
;
typedef pair
<LL
, int> PII
;const int N
= 100010, M
= 200010;int n
, m
, k
;
int h
[N
], e
[M
], w
[M
], id
[M
], ne
[M
], idx
;
LL dist
[N
];
bool st
[N
];
vector
<int> ans
;void add(int a
, int b
, int c
, int d
)
{e
[idx
] = b
, w
[idx
] = c
, id
[idx
] = d
, ne
[idx
] = h
[a
], h
[a
] = idx
++ ;
}void dijkstra()
{memset(dist
, 0x3f, sizeof dist
);dist
[1] = 0;priority_queue
<PII
, vector
<PII
>, greater
<PII
>> heap
;heap
.push({0, 1});while (heap
.size()){auto t
= heap
.top();heap
.pop();int ver
= t
.second
, distance
= t
.first
;if (st
[ver
]) continue;st
[ver
] = true;for (int i
= h
[ver
]; i
!= -1; i
= ne
[i
]){int j
= e
[i
];if (dist
[j
] > dist
[ver
] + w
[i
]){dist
[j
] = dist
[ver
] + w
[i
];heap
.push({dist
[j
], j
});}}}
}void dfs(int u
)
{st
[u
] = true;for (int i
= h
[u
]; ~i
; i
= ne
[i
]){int j
= e
[i
];if (!st
[j
] && dist
[j
] == dist
[u
] + w
[i
]){if (ans
.size() < k
) ans
.push_back(id
[i
]);dfs(j
);}}
}int main()
{scanf("%d%d%d", &n
, &m
, &k
);memset(h
, -1, sizeof h
);for (int i
= 1; i
<= m
; i
++ ){int a
, b
, c
;scanf("%d%d%d", &a
, &b
, &c
);add(a
, b
, c
, i
), add(b
, a
, c
, i
);}dijkstra();memset(st
, 0, sizeof st
);dfs(1);printf("%d\n", ans
.size());for (auto x
: ans
) printf("%d ", x
);return 0;
}
#include<bits/stdc++.h>
using namespace std
;
typedef long long int LL
;
typedef pair
<LL
, int> PII
;
const int N
= 1e5+10,M
=1e5*2+10;
int h
[N
], e
[M
], w
[M
], ne
[M
],id
[M
],idx
;
LL dist
[N
];
bool st
[N
];
int n
,m
,k
;
vector
<int> ans
;
void add(int a
, int b
, int c
,int d
)
{id
[idx
]=d
,e
[idx
] = b
, w
[idx
] = c
, ne
[idx
] = h
[a
], h
[a
] = idx
++ ;
}void dijkstra()
{memset(dist
, 0x3f, sizeof dist
);dist
[1] = 0;priority_queue
<PII
, vector
<PII
>, greater
<PII
>> heap
;heap
.push({0, 1});while (heap
.size()){auto t
= heap
.top();heap
.pop();int ver
= t
.second
, distance
= t
.first
;if (st
[ver
]) continue;st
[ver
] = true;for (int i
= h
[ver
]; i
!= -1; i
= ne
[i
]){int j
= e
[i
];if (dist
[j
] > dist
[ver
] + w
[i
]){dist
[j
] = dist
[ver
] + w
[i
];heap
.push({dist
[j
], j
});}}}
}
void dfs(int u
)
{st
[u
]=1;for(int i
=h
[u
];i
!=-1;i
=ne
[i
]){int j
=e
[i
];if(!st
[j
]&&dist
[j
]==dist
[u
]+w
[i
]){if(ans
.size()<k
) ans
.push_back(id
[i
]);dfs(j
);}}
}
int main(void)
{cin
>>n
>>m
>>k
;memset(h
, -1, sizeof h
);for(int i
=1;i
<=m
;i
++){int a
,b
,c
; cin
>>a
>>b
>>c
;add(a
, b
, c
, i
),add(b
,a
,c
,i
);}dijkstra();memset(st
, 0, sizeof st
);dfs(1);cout
<<ans
.size()<<endl
;for(int i
=0;i
<ans
.size();i
++) cout
<<ans
[i
]<<" ";
}
總結
以上是生活随笔為你收集整理的Acwing第 2 场周赛【完结】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。