当前位置: 首页 > news >正文

2016蘑菇街编程题5题

     花了差不多一天的时间的搞定了这几道题,可能能搞定3道左右,期间也遇到了很多编程细节的问题,还借鉴了别人的思路,坚持练习!

//现在有一张半径为r的圆桌,其中心位于(x, y),现在他想把圆桌的中心移到(x1, y1)。每次移动一步,都必须在圆桌边缘固定一个点然后将圆桌绕这个点旋转。问最少需要移动几步。
//
//输入描述 :
//一行五个整数r, x, y, x1, y1(1≤r≤100000, -100000≤x, y, x1, y1≤100000)
//
//
//输出描述 :
//     输出一个整数,表示答案


#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    long long r, x, y, x1, y1;  //数据类型
    while (cin >> r >> x >> y >> x1 >> y1)  //多次测试
    {
        long d = sqrt((x - x1)*(x - x1) + (y - y1)*(y - y1));
        long result = (d % (2 * r) == 0) ? (d / (2 * r)) : (d / (2 * r) + 1);
        cout << result << endl;
    }

    return 0;
}



//给定一个递增序列,a1 <a2 <...<an 。定义这个序列的最大间隔为d = max{ ai + 1 - ai }(1≤i<n), 现在要从a2, a3 ..an - 1 中删除一个元素。
//问剩余序列的最大间隔最小是多少?
//
//输入描述 :
//第一行,一个正整数n(1 <= n <= 100), 序列长度; 接下来n个小于1000的正整数,表示一个递增序列。
//
//
//输出描述 :
//输出答案。

/*************************操碎了心啊******************************/
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>

int getMaxInterval(vector<int> ans)
{
    int result = 0;
    for (int i = 0; i < ans.size() - 1; i++)
    {
        if (ans[i + 1] - ans[i]>result)
        {
            result = ans[i + 1] - ans[i];
        }
    }
    return result;
}

int main()
{
    int n;
    vector<int> input, mid;
    while (cin >> n)
    {
        for (int i = 0; i < n; i++)
        {
            int temp = 0;
            cin >> temp;
            input.push_back(temp);
        }
        /*mid = input;       //自己写的有错
        for (auto it = input.begin() + 1; it != input.end() - 1; it++)
        {
        input.erase(it);
        if (reuslt>getMaxInterval(input))
        {
        reuslt = getMaxInterval(input);
        }
        else
        reuslt = (getMaxInterval(input));
        input = mid;
        }*/
        /*    int min = INT_MAX;    //参考别人的
        for (int i = 1; i < input.size() - 1; ++i)
        {
        vector<int> tmp = input;//借助的临时变量
        tmp.erase(tmp.begin() + i);
        if (getMaxInterval(tmp) < min)
        min = getMaxInterval(tmp);
        }
        */

        //记录相邻元素的间隔值,间隔值得最大值
        vector<int> temp;
        int maxd = 0;
        for (int i = 1; i <= input.size() - 1; i++)
        {
            temp.push_back(input[i] - input[i - 1]);
            maxd = (input[i] - input[i - 1])>maxd ? (input[i] - input[i - 1]) : maxd;
        }
        //相邻间隔值合并,找出最小的最大间隔
        //当删除元素在原数组的最大间隔的两个元素时候最大间隔增大,当在其他位置时候,
        //这个最大间隔不变,其他位置的间隔增加
        int result = 10000;
        for (int i = 1; i <= temp.size() - 1; i++)
        {
            int d = temp[i] + temp[i - 1];
            if (d > maxd)
            {
                //大于最大间隔里面求最小的;只有当删除每个元素对应的间隔都大于maxd,最大间隔的最小值才有意义
                if (d<result)   //vs下怎么这句话不执行啊???
                {
                    result = d;
                }
                //   result = min(d,result);  //或者这样求最小值
            }
            else     //若其中一个间隔比maxd小,那这是的最大间隔还是maxd;当所有间隔值比maxd小时,最大间隔的最小值就是maxd
            {
                result = maxd;
            }
        }
        cout << result << endl;
    }
    return 0;
}

/*********************************************************/


//A和B是好友,他们经常在空闲时间聊天,A的空闲时间为[a1, b1], [a2, b2]..[ap, bp]。
//B的空闲时间是[c1 + t, d1 + t]..[cq + t, dq + t], 这里t为B的起床时间。这些时间包括了边界点。B的起床时间为[l, r]的一个时刻。
//若一个起床时间能使两人在任意时刻聊天,那么这个时间就是合适的,问有多少个合适的起床时间?
//
//输入描述 :
//第一行数据四个整数:p,q,l,r(1≤p,q≤50,0≤l≤r≤1000)。接下来p行数据每一行有一对整数ai,bi(0≤ai<bi≤1000)表示a的时间表,
//接下来p行每行一对整数ci,di(0≤ci,di≤1000)表示b的时间表。保证ai+1>bi,ci+1>di
//
//输出描述 :
//输出答案个数

//解题思路:
//
//小蘑的时间假设为[a,b],小菇的时间假设是[c + t,d + t],小菇起床的时间是t∈[l,r]
//那么当"a < b < (c+t) < (d+t)"或者"(c+t) < (d+t) < a < b"的情况时,小蘑和小菇无法聊天,由题目条件已知"a < b"和"c < d",那么推出"(c+t) < (d+t)"
//所以仅仅当"b < (c+t)"或者"(d+t) < a"时无法聊天,其余情况都是可以聊天的
/**********************************************************************/
#include<iostream>
using namespace std;
#include<vector>
int p, q, l, r;
bool isAdapter(int t,vector<vector<int>> m,vector<vector<int> > n)
{
    int count = 0;
    for (int i = 0; i < p; i++)
    {
        for (int j = 0; j < q; j++)
        {
            if (!(m[i][1] + t)<n[j][0] || !(n[j][2] + t)<m[i][0])
            {
                return true;
            }
        }
    }
    return false;
}
int main()
{
    while (cin>>p>>q>>l>>r)
    {    
        int temp=0;
        vector<vector<int>> m(p,vector<int>(2)), n(q,vector<int>(2));
        for (int i = 0; i < p; i++)  //输入有效性
        {
            for (int j = 0; j < 2; j++)
            {
                cin >> temp;
                m[i][j] = temp;
            }
        }
        for (int i = 0; i < q; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                cin >> temp;
                n[i][j] = temp;
            }
        }
        int count = 0;
        for (int t = l; t <= r; t++)
        {
            if (isAdapter(t, m, n))
                count++;
        }
        cout << count << endl;
    }
    return 0;
}

/************************************************************************************/

//有一个投篮游戏。球场有p个篮筐,    编号为0,1...,p - 1   。每个篮筐下有个袋子,每个袋子最多装一个篮球。
//有n个篮球,每个球编号xi 。规则是将数字为xi 的篮球投到xi 除p的余数为编号的袋里。若袋里已有篮球则球弹出游戏结束  输出i  ,否则重复至所有球都投完。
//输出 - 1。问游戏最终的输出是什么?
//输入描述:
//第一行两个整数p, n(2≤p, n≤300)。p为篮筐数,n为篮球数。接着n行为篮球上的数字xi(0≤xi≤1e9)
//输出描述:
//输出游戏的结果
//输入例子 :
//10 5
//0
//21
//53
//41
//53
//输出例子:
//4
/*********************************************************/
#include<iostream>
using namespace std;
#include<vector>
int main()
{
    int p, n;
    while (cin>>p>>n)
    {
        vector<long long> bNumber(n,0);  //bNumber(n,0) 这样push_back()会从第五个开始累加,前面5个为0,然后再push数据
        vector<bool> pNumber(p, false);
        long long temp = 0;
        for (int i = 0; i < n; i++)
        {
            //cin >> temp;
            //bNumber.push_back(temp);
            cin >> bNumber[i];   //这样可以避免从第五个累加,确定了下标
        }
        bool complete = true;
        for (size_t i = 0; i < bNumber.size(); i++)
        {
            if (pNumber[bNumber[i] % p] == false)
            {
                pNumber[bNumber[i] % p] =true;
                //continue;
            }
            else if (pNumber[bNumber[i] % p] == true)
            {
                complete = false;
                cout<< i+1<<endl;
                break;
            }
        }
        if (complete)  //处理方法
        {
            cout << -1 << endl;
        }
    }
    return 0;
}

/*********************************************************/


//给定一个字符串,问是否能通过添加一个字母将其变为回文串。
//输入描述:
//
//一行一个由小写字母构成的字符串,字符串长度小于等于10。
//输出描述 :
//
//输出答案(YES\NO).

//1.既然能通过增加一个字符变成回文串,那一定也可以通过删除一个字符变成回文串。用一个循环,每次循环依次删掉一个字符,然后检查新串是否是回文串,看起来简单方便许多。
//2.暴力,在所有位置添加a-z,依次判断是否满足回文串
//3.设置两个指针,一个从头向后,一个从尾向前,如果一样就继续,如果不一样就尝试跳过一个,如果一样就继续,直到指针相遇
//4.转化成这个思想不错:判断原字符串和翻转字符串的最长公共子序列长度是否比原字符串长度小1或相等
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

bool isPalindrome(string str)
{
    string temp = str;
    reverse(str.begin(),str.end());
    return str == temp;
}

int main()
{
    string str;
    while (cin>>str)
    {
        if (str.size()<=0||str.size()==1)
        {
            cout << "YES" << endl;
        }
        else
        {
            bool temp = true;
            for (size_t i = 0; i < str.size(); i++)
            {
                string strTemp = str;
                strTemp.erase(strTemp.begin() + i);   //  tmp = str.substr(0, i) + str.substr(i + 1);  
                if (isPalindrome(strTemp))
                {
                    cout << "YES" << endl;
                    temp = false;
                    break;
                }
            }
            if (temp)
            {
                cout << "NO" << endl;
            }
        }
    }
    return 0;
}

 

相关文章:

  • C指针(二)
  • 用Python开发自动化测试脚本
  • git简单命令
  • 程序员健康Tips
  • 如何从mysql备份中提取单张表数据
  • AVAudioSessionCategory说明
  • 一个Android项目多线程下载模块开源库:AndroidFileDownloader
  • Azkaban的Web Server源码探究系列12: 首页之前的跳转
  • 学习之路-现代密码学基础-001
  • 使用hadoop实现关联商品统计
  • 链表的逆置
  • 帧间提取水印
  • 面试遇到的一些题
  • Charles中如何对https抓包
  • 大家一起和snailren学java-(13)字符串
  • SegmentFault for Android 3.0 发布
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • canvas 绘制双线技巧
  • Codepen 每日精选(2018-3-25)
  • download使用浅析
  • Flex布局到底解决了什么问题
  • gcc介绍及安装
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • java中具有继承关系的类及其对象初始化顺序
  • MySQL主从复制读写分离及奇怪的问题
  • nginx 负载服务器优化
  • Redis在Web项目中的应用与实践
  • vue:响应原理
  • Vue2.0 实现互斥
  • 闭包,sync使用细节
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 前端设计模式
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 算法之不定期更新(一)(2018-04-12)
  • 微服务入门【系列视频课程】
  • 微信公众号开发小记——5.python微信红包
  • HanLP分词命名实体提取详解
  • 如何用纯 CSS 创作一个货车 loader
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ###C语言程序设计-----C语言学习(3)#
  • #QT项目实战(天气预报)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (算法)Game
  • (转)人的集合论——移山之道
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 8.0 发布到 IIS
  • .Net MVC4 上传大文件,并保存表单
  • .net 使用ajax控件后如何调用前端脚本