賽碼網3月31號模擬試題(C++)

寫在前面:

閒來無事把賽碼網的幾個模擬測試做了下,其中一些解題思路即感悟記錄於此。

進入正題:

概要: 總共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;
}


總結:

找工作路漫漫,但求不忘初心,回首對得起走過的路。

代碼地址: [luuuyi/some_companies_test]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章