寫在前面:
閒來無事把賽碼網的幾個模擬測試做了下,其中一些解題思路即感悟記錄於此。
進入正題:
概要: 總共2個題,一個小時的時間安排。題目難度適中偏簡單。
第一題 小賽打車
題目描述:
小賽要去位於 A 市的小碼家。小賽來到 A 市的車站,買了一張 A 市的地圖,他發現這裏的地形非常的複雜。A 市的街道一共有 N 個路口,M 條道路,每條道路連接着兩個路口,並且有各自的長度。目前,小賽所在的車站位於編號爲 1 的路口,而小碼家所在的路口編號爲 N,小賽準備打出租車去,當然,路程越小,付的錢就越少。問題擺在眼前:請幫助小賽尋找一條最短路徑,使得他可以花最少的錢到達小碼家。
大概這就是典型的最短路徑算法吧,節點個數也不多,但是也不少,想用什麼全排列一類的枚舉肯定是會超時的,所以可以使用dijkstra算法來做,時間複雜度O(n*n)。
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
int dijkstra(vector<vector<int>>& table, vector<bool>& marks, vector<int>& dist, int n) {
while(1){
int idx = -1, min_dist = INT_MAX;
for(int i=0;i<n;i++){
if(marks[i]) continue;
if(dist[i]<min_dist){
min_dist = dist[i];
idx = i;
}
}
if(idx==n-1) return dist[idx];
marks[idx] = true;
for(int i=0;i<n;i++){
if(marks[i]) continue;
if(table[idx][i]<INT_MAX&&dist[idx]+table[idx][i]<dist[i]) dist[i] = dist[idx]+table[idx][i];
}
}
}
int main() {
int n = 0, m = 0;
cin >> n >> m;
vector<vector<int>> table(n,vector<int>(n,INT_MAX));
for (int i = 0; i<m; i++) {
int a = 0, b = 0, c = 0;
cin >> a >> b >> c;
table[a-1][b-1] = c; table[b-1][a-1] = c;
}
vector<bool> marks(n, false);
vector<int> dist(n,INT_MAX);dist[0] = 0;
int result = dijkstra(table, marks, dist, n);
cout << result << endl;
return 0;
}
/*#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
vector<vector<int> > mp(n+1,vector<int>(n+1,INT_MAX));
int p1,p2,l;
for(int i=0;i<m;++i){
cin>>p1>>p2>>l;
mp[p1][p2]=l;
mp[p2][p1]=l;
}
vector<int> dis(n+1,INT_MAX);
vector<bool> visited(n+1,false);
dis[1]=0;
while(1){
int index=-1;
int mind=INT_MAX;
for(int i=1;i<=n;++i){
if(visited[i])continue;
if(dis[i]<mind){
mind=dis[i];
index=i;
}
}
if(index==n){
cout<<dis[index]<<endl;
return 0;
}
visited[index]=true;
for(int i=1;i<=n;++i){
if(visited[i])continue;
if(mp[index][i]<INT_MAX&&dis[i]>dis[index]+mp[index][i]){
dis[i]=dis[index]+mp[index][i];
}
}
}
return 0;
}
*/
第二題 完美數
題目描述:
我們稱一個正整數n是完美數,如果n的所有因子的平方和f(n)是一個完全平方數。
例如n=10,那麼f(n)=1+4+25+100=130,所以10不是一個完美數。
請求出小於n的所有完美數的和。
對於40%的數據n<=10000
對於100%的數據n<=1000000
這道題也是暫時想不出有什麼更優的方法,唯一能想到的就是按規則來枚舉,最後也是過了。
#include <iostream>
#include <cmath>
using namespace std;
/*bool check(int num){
int ret = 0;
for(int i = 1; i <= num / 2; i ++)
if(num % i == 0)
ret += i * i;
ret += num * num;
int x = sqrt((double)ret);
if(x * x == ret)
return true;
return false;
}*/
bool isValid(int n){
long long ans = n*n;
for(int i=1;i<=n/2;i++){
if(n%i==0) ans += i*i;
}
long long x = sqrt(ans);
if(x*x==ans) return true;
else return false;
}
int main(){
int n;
cin >> n;
long long ans = 0;
for(int i=1;i<=n;i++){
if(isValid(i)) ans += i;
}
cout << ans << endl;
return 0;
}
總結:
找工作路漫漫,但求不忘初心,回首對得起走過的路。