lc71T3
我自己写了一火车皮,别人的好简洁,呜呜,菜哭了
三语言老哥写的类 很好用
因为秒数的范围[0,99], 分两种场景讨论:🤗🥰🤨🤪😎
a. mins = target / 60, secs = target % 60;
b. mins = target / 60 - 1, secs = target % 60 + 60;
将mins*100+secs转为字符串进行处理, 求出花费的时间即可
class Solution {
public:
int minCostSetTime(int s, int m, int p, int t) {
int minn=t/60;
int sec=t%60;
int ans1=cal(s,m,p,minn,sec);
int ans2=cal(s,m,p,minn-1,sec+60);
return min(ans1,ans2);
}
int cal(int s,int m,int p,int minn,int sec){
if(minn>99||minn<0||sec>99)return INT_MAX; /* 非法输入返回 */
string st=to_string(minn*100+sec); /* 转为字符串, 去除前导0 */
int ans=0;
for(int i=0;i<st.size();i++){
if(s==st[i]-'0')ans+=p;
else ans+=p+m;
s=st[i]-'0';
}
return ans;
}
};
😪😫☹😰🤧
class Solution {
public:
int minCostSetTime(int s, int v, int p, int t) {
int res=-1;
for (int i=0;i*60<=t&&i<=99;i++)
{
int x=t-i*60;
if (x>99) continue;//秒的时间超了
int nowv=0;
static int a[5];
a[4]=x%10;
a[3]=x/10;
a[2]=i%10;
a[1]=i/10;
int nowl=0;
for (int j=1;j<=4;j++)
{
if (a[j]==0) nowl++;
else break;
}
int nows=s;//nows就是现在的手指数字
for (int j=nowl+1;j<=4;j++)//注意是从下标0开始存储的
{
if (nows!=a[j]) nowv+=v;//加上移动时间
nowv+=p;//加上按压时间
nows=a[j];
}
if (res==-1) res=nowv;
else res=min(res,nowv);
}
return res;
}
};
学dfs迫在眉睫呜呜呜😓😱
class Solution {
public:
int dfs(int startAt,int moveCost,int pushCost,vector<int> &target,int idx){
if(idx == 4)return 0;
if(target[idx] != startAt)return moveCost + pushCost + dfs(target[idx],moveCost,pushCost,target,idx+1);
else return pushCost + dfs(target[idx],moveCost,pushCost,target,idx+1);
}
int minCostSetTime(int startAt, int moveCost, int pushCost, int targetSeconds) {
int res = INT_MAX;
for(int i = 0; i <= 9;++i){
for(int j = 0;j <= 9;++j){
for(int k = 0;k <= 9;++k){
for(int l = 0; l <= 9;++l){
if(i * 60 * 10 + j * 60 + k * 10 + l == targetSeconds){
vector<int> tmp = {i,j,k,l};
int idx = 0;
while(tmp[idx] == 0)++idx;
res = min(res,dfs(startAt,moveCost,pushCost,tmp,idx));
}
}
}
}
}
return res;
}
};
很多人只过了222个,加了个min(99,)就好了.😯😟🤐
第一、按常规套路整除60取模60得到分钟和秒;
第二、如果秒数少于40以及分钟不为零,则分钟减一和秒钟加60。
class Solution {
public:
int minCostSetTime(int startAt, int moveCost, int pushCost, int target) {
int mins = target / 60, sec = target % 60, first = mins * 100 + sec, second = -1;
if (mins > 0 && sec <= 39) second = (mins - 1) * 100 + sec + 60;
string fi_str = to_string(first); // 按十进制乘方取模读取也可以,不必转为字符串
int pre = startAt; // 上一个按键
int fi_ans = 0, sec_ans = 0; // 两种情况的代价
// 第一种情况
for (char & ch : fi_str) {
if (ch - '0' != pre) {
fi_ans += moveCost;
}
fi_ans += pushCost;
pre = ch - '0';
}
// 第二种情况,秒数+60
if (second != -1) {
string sec_str = to_string(second);
pre = startAt;
for (char & ch : sec_str) {
if (ch - '0' != pre) sec_ans += moveCost;
sec_ans += pushCost;
pre = ch - '0';
}
}
if ( first > 9999 ) fi_ans = INT_MAX; // 分钟数太大,越界
return second != -1 ? min(sec_ans, fi_ans) : fi_ans;
} //最多显示99 * 60 + 99秒,越界的情况不能取
};
我人麻了 很是无语 干写一个小时🤡👿🧐🥳🥺💩💩💩🤖🤖💩💩
class Solution {
public:
int minCostSetTime(int s, int m, int p, int t) {
int res=0;
vector<int> ans;
if(t<=99){
if(t<10){
if(s!=t)res+=m+p;
else res+=p;
}
else{
if(s!=t/10&&t/10==t%10)res+=m+2*p;
else if(s!=t/10&&t/10!=t%10)res+=2*m+2*p;
else if(s==t/10&&t/10==t%10)res+=2*p;
else if(s==t/10&&t/10!=t%10)res+=2*p+m;
}
}
else{
if(t%60==0){
// ans+=(t/60-1)*100+60;
// if(s!=t/100&&t/100!=t/)res+=
ans.push_back(t/60-1); ans.push_back(6); ans.push_back(0);
if(ans[0]!=s&&ans[0]!=ans[1]&&ans[1]!=ans[2])res+=3*m+3*p;
if(ans[0]!=s&&ans[0]!=ans[1]&&ans[1]==ans[2])res+=2*m+3*p;
if(ans[0]!=s&&ans[0]==ans[1]&&ans[1]!=ans[2])res+=2*m+3*p;
if(ans[0]==s&&ans[0]!=ans[1]&&ans[1]!=ans[2])res+=2*m+3*p;
if(ans[0]!=s&&ans[0]==ans[1]&&ans[1]==ans[2])res+=m+3*p;
if(ans[0]==s&&ans[0]==ans[1]&&ans[1]!=ans[2])res+=m+3*p;
if(ans[0]==s&&ans[0]!=ans[1]&&ans[1]==ans[2])res+=m+3*p;
if(ans[0]==s&&ans[0]==ans[1]&&ans[1]==ans[2])res+=3*p;
else{
ans.push_back(t/1000);ans.push_back(t/100-(t/1000)*10);ans.push_back(t/10-((t/1000)*100)-(t/100-(t/1000)*10)*10);ans.push_back(t%1000);
if(ans[0]!=s&&ans[0]!=ans[1]&&ans[1]!=ans[2]&&ans[2]!=ans[3])res+=4*m+4*p;
if(ans[0]!=s&&ans[0]!=ans[1]&&ans[1]==ans[2]&&ans[2]!=ans[3])res+=3*m+4*p;
if(ans[0]!=s&&ans[0]==ans[1]&&ans[1]!=ans[2]&&ans[2]!=ans[3])res+=3*m+4*p;
if(ans[0]==s&&ans[0]!=ans[1]&&ans[1]!=ans[2]&&ans[2]!=ans[3])res+=3*m+4*p;
if(ans[0]!=s&&ans[0]!=ans[1]&&ans[1]!=ans[2]&&ans[2]==ans[3])res+=3*m+4*p;
if(ans[0]!=s&&ans[0]!=ans[1]&&ans[1]==ans[2]&&ans[2]==ans[3])res+=2*m+3*p;
if(ans[0]!=s&&ans[0]==ans[1]&&ans[1]!=ans[2]&&ans[2]==ans[3])res+=2*m+3*p;
if(ans[0]==s&&ans[0]!=ans[1]&&ans[1]!=ans[2]&&ans[2]==ans[3])res+=2*m+3*p;
if(ans[0]!=s&&ans[0]==ans[1]&&ans[1]==ans[2]&&ans[2]!=ans[3])res+=2*m+3*p;
if(ans[0]==s&&ans[0]!=ans[1]&&ans[1]==ans[2]&&ans[2]!=ans[3])res+=2*m+3*p;
if(ans[0]==s&&ans[0]==ans[1]&&ans[1]!=ans[2]&&ans[2]!=ans[3])res+=2*m+3*p;
if(ans[0]!=s&&ans[0]==ans[1]&&ans[1]==ans[2]&&ans[2]==ans[3])res+=m+3*p;
if(ans[0]==s&&ans[0]!=ans[1]&&ans[1]==ans[2]&&ans[2]==ans[3])res+=m+3*p;
if(ans[0]==s&&ans[0]==ans[1]&&ans[1]!=ans[2]&&ans[2]==ans[3])res+=m+3*p;
if(ans[0]==s&&ans[0]==ans[1]&&ans[1]==ans[2]&&ans[2]!=ans[3])res+=m+3*p;
if(ans[0]==s&&ans[0]==ans[1]&&ans[1]==ans[2]&&ans[2]==ans[3])res+=4*p;
}
}
}
return res;
}
};