Problem 1000 to 1002

Problem 1000

问题: 输入两个正整数A,B,输出两个正整数之和A+B

using System;
//Input integer number A,B,output A+B.
    class Program
    {
        static void Main(string[] args)
        {
            string[] s = Console.ReadLine().Split();
            Console.WriteLine("{0}", Convert.ToInt16(s[0]) + Convert.ToInt16(s[1]));
        }
    }

主要知识点:强制类型转换(有很多种方式:http://blog.csdn.net/under_moon/article/details/4927423

Problem 1001

问题:输入一系列数(数的范围从0~10^18),这些数之间用空格及换行符等分隔。输出这些数的平方根(从最后一个数开始到第一个数),并将结果保留四位小数。

实现代码:

using System;

namespace Q1001
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = Console.In.ReadToEnd().Trim();
            char[] divide={‘\r‘,‘\t‘,‘ ‘,‘\n‘,‘\v‘};
            string[] s=str.Split(divide,StringSplitOptions.RemoveEmptyEntries);
            for(int i=s.Length-1;i>=0;i--)
                Console.WriteLine("{0:F4}",Math.Sqrt(Convert.ToDouble(s[i])));
            Console.ReadKey();
        }
    }
}

主要知识点:

  1. In.ReadToEnd(输入全部字符串,Ctrl+z---输入结束)
  2. String.Split(char[],StringSplitOptions):将字符串划分成一系列字符串https://msdn.microsoft.com/zh-cn/library/ms131448%28v=vs.110%29.aspx

采用正则表达式的方法:

using System;
using System.Text.RegularExpressions;

namespace Q1001
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] nums = Regex.Split(Console.In.ReadToEnd().Trim(),@"\s+");
            //等价于Regex [email protected]"\s+";  reg.Split(Console.In.ReadToEnd.Trim());
            for (int i = nums.Length - 1; i >= 0; i--)
                Console.WriteLine("{0:F4}", Math.Sqrt(ulong.Parse(nums[i])));
            Console.ReadKey();
        }
    }
}

主要知识点:

  1. Regex.Split()的用法:https://msdn.microsoft.com/zh-cn/library/ze12yx1d%28v=vs.110%29.aspx
  2. 正则表达式一些符号含义:http://blog.163.com/l.h.s./blog/static/1040013202009110104348992/

Problem 1002

问题:Phone Numbers.  在手机键盘上九宫格输入模式下,每个方格里含有一个数字和几个字母(或者理解为一个数字对应几个字母),以下为一种对应关系:找出几个单词所对应的数字串组合起来恰好等于所给的数字串

输入: 第一行输入一串数字(可以理解为电话号码),第二行输入需要输入的单词数,下面几行依次输入这几个单词。

输出:如果找到则显示这几个单词(之间用空格分隔),没找到则显示No solution.

不断执行上述过程,直到输入的一串数字为-1,停止。

实现代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

namespace Q1002_modify
{
    class Program
    {
        static void Main(string[] args)
        {
            Start(Console.In, Console.Out);
        }

        static void Start(TextReader reader,TextWriter writer)
        {
            while(true)
            {
                string phonenum = reader.ReadLine();
                if (phonenum == "-1")
                    break;
                int num=Int16.Parse(Console.ReadLine());
                string[] words=new string[num];
                string[] number=new string[num];
                for(int i=0;i<num;i++)
                {
                    words[i] = Console.ReadLine();
                    number[i] = WordToNum(words[i]);
                }
                int[] result = GetMatchIndex(phonenum, number);
                if (result != null)
                {
                    foreach (int a in result)
                        Console.Write("{0} ", words[a]);
                    Console.WriteLine();
                }
                else
                    Console.WriteLine("No solution.");
            }
        }

        //将字母转换为数字
        static string WordToNum(string word)
        {
            //使与字母相对应的数字恰好为数组的下标
            string[] phonenum = { "oqz", "ij", "abc", "def", "gh", "kl", "mn", "prs", "tuv", "wxy" };
            int[] num = new int[word.Length];
            int pos = 0;
            foreach (char s in word)  //将字母转换为数字
            {
                for (int i = 0; i < phonenum.Length; i++)
                {
                    if (phonenum[i].Contains(s))
                    {
                        num[pos] = i;
                        pos++;
                        break;
                    }
                }
            }
            //将数字变为字符串形式---后续所需
            string number = null;
            for (int i = 0; i < num.Length; i++)
                number+= num[i].ToString();
            return number;
        }
        //用于记录字符长度和起始位置
        struct Range
        {
            public int Length;
            public int First;
        }

        //检测单词对应的数字组合起来是否与号码相对应
        static int[] GetMatchIndex(string phonenum,string[] words)
        {
            //记录字符串匹配开始位置
            bool[] match = new bool[phonenum.Length + 2];
            match[1] = true;
            Range[] list = new Range[match.Length];
            for (int i = 1; i < list.Length; i++)
                list[i].Length = phonenum.Length + 1;
            for (int i = 1; i <= phonenum.Length; i++)  //从phonenum初始端一直往下寻找
            {
                if (!match[i])  //确定开始首字母位置
                    continue;
                for (int j = 0; j < words.Length; j++)
                {
                    int n = words[j].Length;
                    //当单词长度超过剩余匹配长度及该字符串非此号码的子字符串时直接跳出该次循环
                    if (phonenum.Length - i + 1 < n || words[j] != phonenum.Substring(i - 1, n))
                        continue;
                    match[i + n] = true; //指定下一个开始的位置
                    if (list[i + n - 1].Length <= list[i - 1].Length + 1)
                        continue;
                    list[i + n - 1].Length = list[i - 1].Length + 1; //记录单词个数
                    list[i + n - 1].First = j; //标明了符合的子字符串在phonenum中的位置
                }
            }
            int k = phonenum.Length;
            if (list[k].Length > k)
                return null;
            int[] idxs = new int[list[k].Length];
            for (int i = idxs.Length - 1; i >= 0; k -= words[idxs[i]].Length, i--)
                idxs[i] = list[k].First;
            return idxs;
        }
    }
}

主要知识点:

  1. 动态规划问题(空间来代替一部分时间),在此题中很巧妙的运用了 bool[] match这语句来记录匹配的起始位置。---动态规划详见:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741374.html
  2. 字符转换为数字部分: 既可以如上 static string WordToNum(string word)也可以 利用字典如下:
string WordToNumber(string word)
        {
            char[] number = new char[word.Length];
            for (int i = 0; i < word.Length; i++)
                number[i] = TheDictionary[word[i]];
            return new string(number);
        }

        Dictionary<char, char> theDictionary = null;

        Dictionary<char, char> TheDictionary
        {
            get
            {
                if (theDictionary == null)
                {
                    theDictionary = new Dictionary<char, char>();
                    for (int i = 0; i < 26; i++)
                        theDictionary.Add((char)(‘a‘ + i), "22233344115566070778889990"[i]);
                }
                return theDictionary;
            }
        }

此问内容很大程度上来自此博客http://www.cnblogs.com/skyivben/archive/2008/12/09/1351119.html

时间: 2024-11-08 21:16:30

Problem 1000 to 1002的相关文章

TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization &amp; Codeforces 839 E

传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相加,含有n个不同变量的式子的最大值. 另外限制了每一个变量的最大最小值R[i]和L[i]和所有变量之和的最大值Max. n<=13 题外话: 刚开始做这道题的时候,感觉意外眼熟? codeforces 839 E(此题的退化版):http://codeforces.com/contest/839/pro

Problem 1000

输入:一行,两个空格隔开的整数A,B 输出:一个数A+B. #include <iostream> using namespace std; int main() { int a,b; cin>>a>>b; cout<<a+b; return 0; } #include <stdio.h> scanf("%d %d",&a,&b);

TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame

题目简述  一个人在一个n * m棋盘上玩游戏,想要占领一个格子有两个方法: 在这个格子放一个棋子.  这个格子周围(四联通)的格子中**都有棋子**. 在(i, j)中放棋子需要花费cost[i][j],占领(i, j)能获得benefit[i][j].求一种放置棋子的方法,使得总收益(收益 - 花费)最大. 2<=n,m<=20 分析 一眼看上去, 状压? 我是不是dp学傻了..根本想不出 网络流? 嗯,此题是一道非常套路的网络流练习题. 如果想不到对棋盘进行黑白染色,就GG了. 所以套路

TopCoder SRM 561 Div 1 - Problem 1000 Orienteering

传送门:https://284914869.github.io/AEoj/561.html 题目简述: 题外话: 刚开始看题没看到|C|<=300.以为|C|^2能做,码了好久,但始终解决不了一棵树中多条直径去重的问题.后来才发现|C|<=300,暴力就可以了. 不知道有哪位大佬会|C|^2的做法?? 思路: 很显然,若length为树中经过所有S中的点的最短路径长度, 若size为虚树中所有边的长度和, 若dis为虚树中的最远点对的距离(即直径长度) 那么length=size*2-dis.

Topcoder SRM 660 Div2 Problem 1000 Powerit (积性函数)

令$f(x) = x^{2^{k}-1}$,我们可以在$O(k)$的时间内求出$f(x)$. 如果对$1$到$n$都跑一遍这个求解过程,时间复杂度$O(kn)$,在规定时间内无法通过. 所以需要优化. 显然这是一个积性函数,那么实际上只要对$10^{6}$以内的质数跑$O(k)$的求解过程. 而$10^{6}$以内的质数不到$8*10^{4}$个,优化之后可以通过. #include <bits/stdc++.h> using namespace std; #define rep(i, a,

C - A + B Problem II HDU - 1002

普通大数相加: (1)超时: while循环条件不改变,导致死循环 (2)wa:   s1,s2为字符串,len1=strlen(s1),len2=strlen(s2); swap(s1,s2)后,没有交换len1,len2 (3)格式错误:   最后一行不要换行,每两个测试样例之间换行. 看来我的菜是永无止境的,下次写代码,记得注意: 1. 题目要求的输出格式 2. 仔细想想每一条语句对上面的变量是否会造成影响. 3. 输出的时候多测试,随机数测试也是有必要的,必须把所有可能情况都测一遍再交.

[ACM]HDU Problem 1000 + Java

//no package name //import when necessary import java.util.Scanner; //it has to be Main class public class Main { public static void main(String[] args){ Scanner input = new Scanner(System.in); //Wrong answer when using while(true) while(input.hasNex

1000: A+B Problem(NetWork Flow)

1000: A+B Problem Time Limit: 1 Sec  Memory Limit: 5 MBSubmit: 11814  Solved: 7318[Submit][Status][Discuss] Description Calculate a+b Input Two integer a,b (0<=a,b<=10) Output Output a+b Sample Input 1 2 Sample Output 3 HINT Q: Where are the input a

题目1002:Grading(题目背景基于高考打分的简单判断)

题目链接:http://ac.jobdu.com/problem.php?pid=1002 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1002 Grading.cpp // Jobdu // // Created by PengFei_Zheng on 2017/4/14. // Copyright © 2017年 PengFei_Zheng. All rights reserved. // #include <st