- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在 Google Kickstart 竞赛中练习,我目前正在研究 Even Digits problem from Round A of 2018 .
我创建了以下算法,当我对其进行测试时,它运行得非常好。但问题是,当我提交到平台并按下“尝试”按钮时,它显示我的输出不正确。
我尝试使用更大、更复杂的数字重新测试它,但我只是找不到问题所在。
Problem Description:
Supervin has a unique calculator. This calculator only has a display, a plus button, and a minus button. Currently, the integer N is displayed on the calculator display.
Pressing the plus button increases the current number displayed on the calculator display by 1. Similarly, pressing the minus button decreases the current number displayed on the calculator display by 1. The calculator does not display any leading zeros. For example, if 100 is displayed on the calculator display, pressing the minus button once will cause the calculator to display 99.
Supervin does not like odd digits, because he thinks they are "odd". Therefore, he wants to display an integer with only even digits in its decimal representation, using only the calculator buttons. Since the calculator is a bit old and the buttons are hard to press, he wants to use a minimal number of button presses.
Please help Supervin to determine the minimum number of button presses to make the calculator display an integer with no odd digits.
Input
The first line of the input gives the number of test cases, T. T test cases follow. Each begins with one line containing an integer N: the integer initially displayed on Supervin's calculator.
这是我的代码:
public static void Main(string[] args)
{
var SCount = Console.ReadLine();
long Count = Convert.ToInt64(SCount);
for (long i = 0; i < Count; i++)
{
var val = Console.ReadLine();
long l = Convert.ToInt64(val);
Console.WriteLine("Case #{0}: {1}", i + 1, Slover4(l));
}
}
public static long Slover4(double N)
{
char[] odds = { '1', '3', '5', '7', '9' };
double presses_p = 0;
double PN = N;
double presses_n = 0;
double NN = N;
double pdegits = -1;
for (int i = PN.ToString().Length - 1; i >= 0; i--)
{
pdegits += 1;
//2110
//2018 EVEN EVEN (ODD EVEN) ---->
//11 ODD OOD <----
//1 ODD ---->
//42 EVEN EVEN XXXXX 6969 1 | 6970 30 | 7000 -200 | 6800
#region Positives
if (i > 0 && odds.Contains(PN.ToString()[i]) &&
odds.Contains(PN.ToString()[i - 1])) // ODD - ODD
{
var val = int.Parse(string.Concat(PN.ToString()[i - 1], PN.ToString()[i]));
var lv = int.Parse(PN.ToString()[i].ToString());
//15 17 19
//5 3 1
presses_p += (5 - (lv - 5)) * Math.Pow(10, pdegits);
PN += (5 - (lv - 5)) * Math.Pow(10, pdegits);
}
else if (i != 0 &&
!odds.Contains(PN.ToString()[i - 1]) &&
odds.Contains(PN.ToString()[i])) // EVEN - ODD
{
presses_p += Math.Pow(10, pdegits);
PN += Math.Pow(10, pdegits);
}
else if (i != 0 &&
odds.Contains(PN.ToString()[i - 1])) // ODD - EVEN
{
var val = int.Parse(string.Concat(PN.ToString()[i - 1], PN.ToString()[i]));
var lv = int.Parse(PN.ToString()[i].ToString());
//10 12 14 16 18
//10 8 6 4 2 ->
//10 12 14|
//2 4 6 |
presses_p += (10 - lv) * Math.Pow(10, pdegits);
PN += (10 - lv) * Math.Pow(10, pdegits);
}
else if (i == 0 &&
odds.Contains(PN.ToString()[i])) // ODD Only
{
presses_p += Math.Pow(10, pdegits);
PN += Math.Pow(10, pdegits);
}
#endregion
#region Negatives
if (i > 0 &&
odds.Contains(NN.ToString()[i]) &&
odds.Contains(NN.ToString()[i - 1])) // ODD - ODD
{
var val = int.Parse(string.Concat(NN.ToString()[i - 1], NN.ToString()[i]));
var lv = int.Parse(NN.ToString()[i].ToString());
//11 13 15 17 19
//3 5 7 9 11
presses_n += (3 + (lv - 1)) * Math.Pow(10, pdegits);
NN -= (3 + (lv - 1)) * Math.Pow(10, pdegits);
}
else if (i != 0 &&
!odds.Contains(NN.ToString()[i - 1]) &&
odds.Contains(NN.ToString()[i])) // EVEN - ODD
{
presses_n += Math.Pow(10, pdegits);
NN -= Math.Pow(10, pdegits);
}
else if (i != 0 &&
odds.Contains(NN.ToString()[i - 1])) // ODD - EVEN
{
var val = int.Parse(string.Concat(NN.ToString()[i - 1], NN.ToString()[i]));
var lv = int.Parse(NN.ToString()[i].ToString());
//10 12 14 16 18
//2 4 6 8 10 <-
presses_n += (2 + lv) * Math.Pow(10, pdegits);
NN -= (2 + lv) * Math.Pow(10, pdegits);
}
else if (i == 0 &&
odds.Contains(NN.ToString()[i])) // ODD Only
{
presses_n += Math.Pow(10, pdegits);
NN -= Math.Pow(10, pdegits);
}
#endregion
}
//$"P:{presses_p} - N - {presses_n}";
return presses_p < presses_n ? (long)presses_p : (long)presses_n;
}
最佳答案
好吧,让我们从退化的情况开始:
2048
),我们返回0
64087
),我们返回1
现在让 left
成为最左边的奇数位 (leftDigit
) 的索引,例如
2480032581
^
left = 5 (since 2, 4, 8, 0, 0 are even)
leftDigit = 3
我们可以将初始数字变成(通过按 - 按钮)
2480028888
或者(按+键)进入
2480040000
最后,我们可以比较这两种可能性,并选择需要更少压力的一种:
"-" wants 2480032581 - 2480028888 == 3693 presses
"+" wants 2480040000 - 2480032581 == 7419 presses
按 -
是给定数字的更好策略,因此我们返回 3693
。请注意,如果 leftDigit
是 9
我们将坚持 "-"
按下(并忽略 +
策略).
C#代码:
private static long Solution(string value) {
int left = -1;
for (int i = 0; i < value.Length; ++i) {
if ((value[i] - '0') % 2 != 0) {
left = i;
break;
}
}
if (left < 0)
return 0; // All even digits number
else if (left == value.Length - 1)
return 1; // The very last digit is the only odd one
long initial = long.Parse(value.Substring(left));
int leftDigit = value[left] - '0';
if (leftDigit == 9)
return initial - long.Parse(new string('8', value.Length - left));
long plus =
long.Parse((leftDigit + 1).ToString() + new string('0', value.Length - left - 1)) -
initial;
long minus = initial -
long.Parse((leftDigit - 1).ToString() + new string('8', value.Length - left - 1));
return plus < minus ? plus : minus;
}
演示:
string[] tests = new[] {
"42",
"11",
"1",
"2018"
};
string report = string.Join(Environment.NewLine, tests
.Select(test => $"{test,6} -> {Solution(test),3}"));
结果:
42 -> 0
11 -> 3
1 -> 1
2018 -> 2
关于c# - Google Kickstart 2018 年 A 轮的 "Even Digits"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55514484/
我想模仿 kickstarter.com 中使用的堆叠图像。我的问题是图像没有在屏幕上溢出。箭头指向要用图像填充的剩余空间。 这是图片 http://postimage.org/image/9we1j
HTML KickStart 框架有一个不错的默认主题。但是,我想恢复输入字段的默认样式。我如何通过覆盖 KickStart 主题来解决这个问题? HTML5 启动:http://www.99lime
我正在尝试自定义 kickstarter 脚本以在预安装过程中从用户那里提取参数。 命令的格式是: raidtype HAtype partitionSize 即raid1 hanode 2048或r
我正在练习上一轮Google Kick Start 2020提出的问题。这个问题称为Record Breaker,如下所示: Isyana is given the number of visitor
使用以下代码,我尝试从 kickstarter 获取支持者的家乡城市和地点。但是,我不断遇到以下错误: File "D:/location", line 60, in page1 = urllib.
我需要在我的网站中制作 HTML 编辑器,如粗体、斜体、下划线、左对齐等。我的问题是 Kickstarter 是否提供 HTML 编辑器工具栏?我在 google 中搜索并找到了 Niceedit H
我正在尝试创建类似于 kickstarter 的下拉菜单。这里有 2 张图片: 但这是我得到的: 似乎当我单击“Mon compte”并出现下拉菜单时,“Mon compte”按钮的宽度自动更改为与下
我正在将一台 HP 服务器从 Redhat5 升级到 Redhat6,但我的 kickstart 文件使用的是“cciss”类型的驱动器,而 Anaconda 安装程序正在寻找“sda”,因此抛出了“
我有一个项目目前正在使用 kickstart 来自动安装带有各种 RPM 软件包的 CentOS 发行版。我现在需要在安装过程中添加一个新的 RPM,我已将它添加到我的 %packages 部分,但由
使用以对话框“您有多个该系统上的网络设备。你想通过哪一个安装?” 配置了 PXEboot 的机器有两个以太网接口(interface)。什么是下面的网络条目中缺少?我希望此安装继续进行无需询问哪个以太
在 kickstart 安装期间,我尝试在 %pre 部分配置网络,但它不起作用。 当我在 kickstart 文件的主体中配置网络时,它可以工作(如下所示): firewall --disabled
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我正在使用 commerce kickstart v2 构建概念验证电子商务解决方案 我希望实现一个系统,用户可以提交订单,但管理员必须在客户付款之前批准订单 - 我感觉我可以通过规则和额外订单状态来
我正在寻找可以实现与 Kickstarter 或众筹长期进度条相同效果的解决方案或现有插件。 我在这里找到的现有解决方案都与短期动态进度条有关,这些进度条会向用户显示剩余的百分比或时间。 http:/
我正在尝试一个项目来自动化 kickstart 图像,但是我卡在了我的第一个子任务上。 redhat 下载的下载链接如下所示: https://access.cdn.redhat.com//conte
目前我正在设置一个 Kickstart 文件,它将使用 Kickstart 的“%package”部分在 Ubuntu 服务器 (16.04.2 LTS) 上安装 snort 软件和所需的依赖项。 问
我正在尝试使用 kickstart 文件和 VM 安装 CentOS7。我正在使用 ISO 的 netinstall 版本。 当我尝试将 URL 放入 kickstart 文件时,检查安装源需要很长时
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在尝试解决 Scrambled Words Google Kickstart 2018 A 轮问题。 我在生成输入字符串时遇到问题。这是他们给出的指示 The third line contain
我在某些测试用例中得到了不正确的输出,其中我的代码失败了。它对大多数输入都正确运行。这是我的代码问题链接https://codejam.withgoogle.com/codejam/contest/8
我是一名优秀的程序员,十分优秀!