【C#的学习旅程】Linq _2015编程之美挑战赛初赛 CodeHunt赛区

序言

2015 编程之美挑战赛·初赛结束了,小伙伴们似乎都在Hihocoder上愉快的玩耍……

只有我一个人默默地打着Code Hunt……

啊对了,默默的全题3SP的AK了哟……

来逐题写下题解和解题源码吧…… (P.S 有什么不好的或者说得不对的地方请告诉我哦,我会立马改正的~(●‘?‘●))

Section 00 BAIYUN

00.01 Tutorial 教程

点进去会有一个小动画,亲切的告诉你玩法,

新手们可以看看这个哦~~

00.02 求最值

Math里有这样一个函数,返回a与b之间的最值:Math.Max(a,b)

//00.02
using System;
public class Program {
  public static int Puzzle(int a, int b) {
    return Math.Max(a,b);
  }
}

00.03 找规律

给了两个数对,仔细观察得知(好吧其实我做过所以有经验了)答案是<a1b2+a2b1, a2b2>

//00.03
using System;
public class Program {
    // Each array contains two elements
    public static int[] Puzzle(int[] a, int[] b) {
      int[] t=new int[2];
      t[0]=a[0]*b[1]+a[1]*b[0];
      t[1]=a[1]*b[1];
      return t;
    }
}

00.04 进制转换(十进制转二进制)

进制转换的话,至少十进制为源数的情况下是很方便的有相应的函数的:

以前的文章里也有提到过:Here

以及还写过一个C++的模板:Here

//00.04
using System;
public class Program {
  public static string Puzzle(int n) {
    string j = Convert.ToString(n, 2);
    return j;
  }
}

00.05 元素前移

这题是把字符串用空格分隔开,每一个部分作为一个元素,循环左移n位(当然等效于n%元素个数 位),得到的新字符串。

其中,分隔通过Split函数实现,循环左移可以通过 newArr[i]=oldArr[(i+n)/len]来实现

最终把string数组连起来的时候中间还需要加空格,这时需要用到的就是Join(a,b)函数,将数组b中的数连起来,两两之间用a分隔。

//00.05
using System;
public class Program {
    public static string Puzzle(string s, int n)
    {
      string[] sArr=new string[100];
      sArr=s.Split(' ');
      int len=sArr.Length;
      string[] ss=new string[len];
      for(int i=0;i<len;i++) ss[i]=sArr[(n+i)%len];
      return String.Join(" ",ss);
    }
}

Section 01 BAOBAO

01.01 判断元素是否完全相同

为了判断元素是否完全一致,我用了Linq里的集合操作,简单的说,找 (a集合的非交集部分)与(b集合的非交集部分)的并集,如果这个集合没有东西,那就是完全相等咯~

//01.01
using System;
using System.Linq;
public class Program {
  public static bool Puzzle(int[] a, int[] b)
  {
    int[] result=a.Except(b).Concat(b.Except(a)).ToArray();
    return result.Length==0;
  }
}

01.02 ISBN校验

没错,看到茫茫多的这东西……我第一反应跟大家一样:这是神马玩意!

不过还是非常良心的每个字符串前面都有个”978-“用来提醒大家,也就是说,给的是一个完整的ISBN。

我们需要判断的True/False,其实是:这个是不是一个合格的ISBN码,判断标准是,从前向后看,前12位,奇数位乘以1,偶数位乘以3,结果对10取模,如果校验码第13位数和这个模加起来刚好是10或者0,这个ISBN校验就成立。(不太理解的话下面有例子)

为了检验题目中给出的是不是这个ISBN,还专门写了个C++程序来做判断:

#include <iostream>
#include <cstring>
#include <string>
using namespace std;

int n[13]={0};

int main()
{
	string s;
	while(cin>>s && s.length())
	{
		int pos=0,ans=0;
		for(int i=0;i<s.length();i++)
		{
			if(s[i]!='-')
			n[pos++]=s[i]-'0';
		}
		for(int i=0;i<12;i++)
		{
			ans+=n[i]*(i%2?3:1);
		}
		ans%=10;
		ans=10-ans;
		cout<<ans<<endl;
	}
	return 0;
}

关于ISBN,详情请见维基百科:Here

考虑到架梯子困难的同学,还是在这里贴张截图

//01.02
using System;
public class Program
{
    public static bool Puzzle(string s)
    {
      int ans=0;
      int pl=0;
      char a='0';
      s=s.Replace("-","");
      for(int i=0;i<s.Length-1;i++)
      {
        if(i%2==0) pl=1;
        else pl=3;
        ans+=((int)s[i]-(int)a)*pl;
      }
      ans%=10; if(ans!=0) ans=10-ans;
      return ans==(int)s[s.Length-1]-(int)a;
    }
}

01.03 进制转换(十进制转四进制)

当发现所有的数字都在0-3之间徘徊的时候大约就能感觉到是四进制数了,进制转换的实现并不困难:

//01.03
using System;
public class Program {
    public static string Puzzle(int n)
    {
      string s="";
      while(true)
      {
        int r=n/4,m=n%4;
        s=m.ToString()+s;
        n=r;
        if(n==0)break;
      }
      return s;
    }
}

01.04 集合求交集

这里也用到了Linq中的函数,求集合交集,这里需要注意的地方在于直接求交集并不能返回int[]类型,我们需要再加上ToArray()

//01.04
using System;
using System.Linq;
public class Program {
    public static int[] Puzzle(int[] a, int[] b)
    {
        return a.Intersect(b).ToArray();
    }
}

至此,解题报告及完整代码说明完毕,若有不明白的或者我有哪里说得不对的,亦或是你有什么更好的算法,请务必在下面评论告诉我o(^▽^)o ~~

我们大家一起努力,一起进步吧~

By okcd00(糖果天王)

题目截图

大家可能想看看题目的数据或者检查下是不是真的3SP之类的,每道题的3SP截图如下所示:

Section 00

Section 01

可怕的01.02测试数据

时间: 2024-10-12 20:01:01

【C#的学习旅程】Linq _2015编程之美挑战赛初赛 CodeHunt赛区的相关文章

【编程之美挑战赛第一场】活动中心

时间限制:12000ms 单点时限:6000ms 内存限制:256MB 描写叙述 A市是一个高度规划的城市,可是科技高端发达的地方,居民们也不能忘记运动和锻炼,因此城市规划局在设计A市的时候也要考虑为居民们建造一个活动中心,方便居住在A市的居民们能随时开展运动,锻炼强健的身心. 城市规划局希望活动中心的位置满足下面条件: 1. 到全部居住地的总距离最小. 2. 为了方便活动中心的资源补给和其它器材的维护,活动中心必须建设在A市的主干道上. 为了简化问题,我们将A市摆在二维平面上,城市的主干道看作

【编程之美挑战赛第一场】树

时间限制:4000ms 单点时限:2000ms 内存限制:256MB 描写叙述 有一个N个节点的树.当中点1是根. 初始点权值都是0. 一个节点的深度定义为其父节点的深度+1,.特别的,根节点的深度定义为1. 如今须要支持一系列以下操作:给节点u的子树中,深度在l和r之间的节点的权值(这里的深度依旧从整个树的根节点開始计算),都加上一个数delta. 问完毕全部操作后,各节点的权值是多少. 为了降低巨大输出带来的开销,如果完毕全部操作后,各节点的权值是answer[1..N].请你依照例如以下方

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

Hadoop学习笔记(7) ——高级编程

Hadoop学习笔记(7) ——高级编程 从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成<key, value>. 2.映射(map):根据输入的<key, value>进生处理, 3.合并(combiner):合并中间相两同的key值. 4.分区(Partition):将<key, value>分成N分,分别送到下一环节. 5.化简(Reduce):将中间结

C++ Primer 学习笔记_66_面向对象编程 --定义基类和派生类[续]

算法旨在用尽可能简单的思路解决问题,理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时不妨从例子入手,通过一个简单的例子,并编程实现,这个过程其实就可以理解清楚算法里的最重要的思想,之后扩展,对算法的引理或者更复杂的情况,对算法进行改进.最后,再考虑时间和空间复杂度的问题. 了解这个算法是源于在Network Alignment问题中,图论算法用得比较多,而对于alignment,特别是pairwise alignment, 又经常遇到maxim

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函

python基础学习05(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #dict{键:值} #哈希 #注:字典是无顺序的,所以你懂的 #创建与赋值 dict1={} dict2={'name':'apply','avg':24,'sex':'man'} print dict1,dict2

C++ Primer 学习笔记_65_面向对象编程 --概述、定义基类和派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)