力扣 第455场周赛(A~C)

A.检查元素频次是否为质数

签到题。

 1 class Solution {
 2 public:
 3     bool isprime(int x){
 4         if(x<=1) return false;
 5         for(int i=2;i<=x/i;i++){
 6             if(x%i==0)
 7                 return false;
 8         }
 9         return true;
10     }
11     bool checkPrimeFrequency(vector<int>& nums) {
12         vector<int> cnt(110,0);
13         for(int i=0;i<nums.size();i++)
14             cnt[nums[i]]++;
15         for(int i=0;i<110;i++){
16             if(isprime(cnt[i]))
17                 return true;
18         }
19         return false;
20     }
21 };

B.硬币面值还原

假设目前有一个硬币集合,其中每个元素都不同的面值,现在给定这个集合表示每个数的方案数目nums,要求这个集合中的元素。

可以观察到,如果某个数x的方案数为1的话,这个数肯定在这个集合中,并且会为大于x的数y贡献 f [ y-x ]个方案,其中f[i]表示构成i有多少种方案,显然f[0]=1.

那么,进一步的,我们枚举i->1~n,当 f [ i ] == nums [ i ]时,表示以目前的coins已经可以拼出i了,直接continue。当f [ i ] == nums [ i ] - 1时我,我们直接加上i,使得i的方案数+1,同时使用i来更新大于i的所有f值。否则,表示无法拼出。

 1 class Solution {
 2 public:
 3     vector<int> findCoins(vector<int>& nums) {
 4         int n=nums.size();
 5         if(n<=0) return {};
 6         vector<int> f(n+1,0);//f[i]表示以目前的coins,i有多少种表示方式
 7         f[0]=1;
 8         vector<int> coins;
 9         for(int i=1;i<=n;i++){
10             int target = nums[i-1];
11             if(f[i]>target) return {};
12             else if(f[i]==target) continue;
13             else if(f[i]==target-1){
14                 coins.push_back(i);
15                 for(int j=i;j<=n;j++){
16                     f[j]+=f[j-i];
17                 }
18             }else{
19                 return {};
20             }
21         }
22         return coins;
23     }
24 };

C.使叶子路径成本相等的最小增量

给定一棵树,每个节点上有权值,每次操作能使得某个节点的值加上任意值,问最少多少次操作,使得从根到叶子节点的路径的路径权值都相等。

建树,然后每次dfs返回子树权值和子树需要的操作次数,那么当前树的权值即为子树权值最大值加上当前节点的值,操作次数则为子树操作次数之和加上当前使得所有子树相等的操作次数。

 1 typedef long long LL;
 2 class Solution {
 3 public:
 4     pair<LL,int> dfs(int u,int parent,vector<vector<int>>& g,vector<int>& cost){
 5         vector<LL> child_v;
 6         int child_add=0;
 7         for(int i=0;i<g[u].size();i++){
 8             int v=g[u][i];
 9             if(v==parent) continue;
10             auto tmp=dfs(v,u,g,cost);
11             child_v.push_back(tmp.first);
12             child_add+=tmp.second;
13         }
14         if(child_v.empty()) return {cost[u],0};
15         LL maxx=*max_element(child_v.begin(),child_v.end());
16         int total_add=child_add;
17         for(int i=0;i<child_v.size();i++){
18             if(child_v[i]<maxx)
19                 total_add++;
20         }
21         return {maxx+cost[u],total_add};
22     }
23     int minIncrease(int n, vector<vector<int>>& edges, vector<int>& cost) {
24         vector<vector<int>> g(n,vector<int>());
25         for(int i=0;i<edges.size();i++){
26             int a=edges[i][0];
27             int b=edges[i][1];
28             g[a].push_back(b);
29             g[b].push_back(a);
30         }
31         auto res=dfs(0,-1,g,cost);
32         return res.second;
33     }
34 };

 

posted on 2025-06-22 13:53  greenofyu  阅读(16)  评论(0)    收藏  举报