第60场LeetCode双周赛
心情
题目在此
双周赛都补题
第一题(使用特殊打字机键入单词的最少时间)
模拟一下,比较每次是逆时针快还是顺时针快,累加答案,即可。
class Solution {
public:
int minTimeToType(string w) {
int res = 0,n = w.size();
int index = 1; //1 ~ 26
for (int i = 0; i < n; i ++){
int t = w[i]-'a'+1;
if (t >= index)res += min(t-index,26-t+index)+1;
else res += min(index-t,26-index+t)+1;
index = t;
}
return res;
}
};
第二题(最大方阵和)
虽说是中等题,但是难度达不到中等水平。记录负数的个数,如果为偶数,那么结果是全部元素的绝对值之和,如果为奇数,那么结果是全部元素绝对值之和减去二倍的最小绝对值。
class Solution {
public:
long long maxMatrixSum(vector<vector<int>>& m) {
int mi = 999999,num = 0,n = m.size();
long long res = 0;
for (int i = 0; i < n; i ++){
for (int j = 0; j < n; j ++){
if (m[i][j] < 0){
num++;
res += -m[i][j];
mi = min(mi,-m[i][j]);
}else {
res += m[i][j];
mi = min(mi,m[i][j]);
}
}
}
if (num%2)res -= 2*mi;
return res;
}
};
第三题(到达目的地的方案数)
typedef long long LL;
const int N = 210;
const int mod = 1e9+7;
class node{
public:
int num; //编号
LL d; //从起点到该点的最短路程
bool operator < (const node &a) const {
return d>a.d;//最小值优先
}
};
class Solution {
public:
void add(int a,int b,long long c){
e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx++;
}
int dp[N];
int h[N*N],e[N*N],ne[N*N],idx = 0;
LL w[N*N],dis[N];
bool st[N];
int countPaths(int n, vector<vector<int>>& r) {
int le = r.size();
memset(h,-1,sizeof h);
for (int i = 0; i < le ; i ++){
int u = r[i][0]+1, v = r[i][1]+1, t = r[i][2];
add(u,v,t);
add(v,u,t);
}
//Dijkstra
memset(dis,0x3f3f,sizeof dis);
dis[1] = 0,dp[1] = 1;
priority_queue<node> q;
q.push((node){1,0});
while(!q.empty()){
int t = q.top().num;
q.pop();
if (st[t]) continue;
st[t] = true;
for (int i = h[t]; i != -1; i = ne[i]){
int j = e[i];
if (dis[j] > dis[t] + w[i]){
dp[j] = dp[t];
dis[j] = dis[t] + w[i];
q.push((node){j,dis[j]});
}else if (dis[j] == dis[t] + w[i])dp[j] = (dp[j]+dp[t])%mod;
}
}
return dp[n];
}
};
第四题(划分数字的方案数)
待 续 待续 待续