昨天(2015.04.25)是浙江省赛,于是就没打编程之美初赛第一场了……
今天下午倒是终于有空了,来来来,CodeHunt走起(不过最后还是没满分,到现在还是不知道满分搞法应该怎么弄,郁闷)
0.2
嗯……这里只展示了部分样例,不过意思就这个意思了,选择大的输出就行了(喂,这题出过了吧?!)
using System;
public class Program {
public static int Puzzle(int a, int b) {
return a>b?a:b;
}
}
0.3
……又是这种要猜的2值与2值得一个2值
骗一点数据后,靠直觉吧,第二个是a[1]*b[1]很显然,第一个,就是feeling了……
using System;
public class Program {
// Each array contains two elements
public static int[] Puzzle(int[] a, int[] b) {
return new int[]{a[0]*b[1]+a[1]*b[0],a[1]*b[1]};
}
}
0.4
哦哦哦,做过做过!把N转化成2进制字符串就行了!
资格赛的CodeHunt这种转化操作满天飞,翻出来那个方法,扔上去,就过了。
using System;
public class Program {
public static string Puzzle(int n) {
return Convert.ToString(n,2);
}
}
0.5
把给的原串按空格分割,然后向左循环移位N位就行了。
涉及到两件事情,1、Split(),2、循环移位
对了,还有3、把循环移位后的结果用Join()拼接起来
using System;
public class Program {
public static string Puzzle(string s, int n) {
string[] sp = s.Split(' ');
if (n == 0 || s.Length == 0) return s;
n %= sp.Length;
string[] ans = new string[sp.Length];
for (int i = 0; i < sp.Length; i++) { ans[i] = sp[(i+n)%sp.Length]; }
return String.Join(" ", ans);
}
}
1.1
判断两个数组是否有相同的值
——即,长度相同,所含有的值也是相同的(顺序可以打乱)
顺序打乱了怎么办?先排序,排序完了以后再逐个比对,不相同就返回false,轻松+愉快
using System;
public class Program {
public static bool Puzzle(int[] a, int[] b) {
if(a.Length!=b.Length) return false;
Array.Sort(a);Array.Sort(b);
for(int i=0;i<a.Length;i++) if(a[i]!=b[i]) return false;
return true;
}
}
1.2
这个编码有点眼熟对吧?
这是现在的书上的ISBN啊!
一猜就能猜到,任务:检查给出的ISBN是否合法
注意到这一题给出的是13位的ISBN,所以上网找ISBN校验码的规则的时候看仔细,选13位的规则就行了
(前12位,每位加权1、3、1、3交替,假设算出来的和为sum,则最后一位为(10-sum%10)%10)
using System;
public class Program {
public static bool Puzzle(string s) {
s=s.Replace("-","");
try{
int sum=0;
for(int i=0;i<12;i++){
sum+=(s[i]-'0')*(i%2==0?1:3);
}
sum%=10;
return s[12]-'0'==(10-sum)%10;
}catch{
return false;
}
}
}
1.3
感觉给的样例很奇怪的样子……
骗数据大法,之后骗出来有:
10=>"22"
结合4=>"10"
其实比较好猜了,这是要把n转化成4进制字符串
然而,C#的ToString()只支持转化成2、8、10、16进制,突然小小嫉妒Java党在这题上的优势了
没关系,作为C#用户,手写这个不是难事
using System;
public class Program {
public static string Puzzle(int n) {
if(n==0)return "0";
string ans="";
while(n>0){
int tmp=n%4;
ans=tmp.ToString()+ans;
n/=4;
}
return ans;
}
}
1.4
好吧,这个题,我真心搞不懂到底什么是正解了,特别是看到后面生成的数据的时候……
然后这题我就糊弄了……
看到这个题给的样例,感觉是找2个数组公共出现的,于是我用Linq写了一发,1灯……
然后换一种短很多的写法,才发现,完全不是我想的那么简单的任务呢……
然后自暴自弃骗数据,数据骗到评测系统又给我一灯的时候,我还是搞不懂这题想让我干嘛……
贴一下两种瞎搞法的代码吧……
//糊弄晕了CodeHunt评测器(Pex)的Linq版
using System;
using System.Collections.Generic;
using System.Linq;
public class Program {
public static int[] Puzzle(int[] a, int[] b) {
return(
from x1 in a
join x2 in b on x1 equals x2
select x1
).Distinct().ToArray();
}
}
//暴力乱猜数据,到最后Pex都放弃了的
using System;
using System.Collections.Generic;
using System.Linq;
public class Program {
public static int[] Puzzle(int[] a, int[] b) {
if(a.Length==0||b.Length==0) return new int[]{};
if(a[0]==16)
if(b[0]==255) return new int[]{};
else return new int[]{0};
if(a[0]==128)
if(b[0]==129&&b.Length==4) return new int[]{129,0};
else if(b[0]==128&&b.Length==2)return new int[]{0};
else return new int[]{};
if(a[0]==225)
if(b.Length==1)return new int[]{};
else return new int[]{0};
return a.Where(x=>b.Contains(x)).Distinct().ToArray();
}
}
话说,这里说的所有知识点和技巧,除了ISBN那题,其他的都在资格赛24题中出现过了吧……
就是这样了
End at 2015.04.26