zoukankan      html  css  js  c++  java
  • Codestorm:Game with a Boomerang

    题目连接:https://www.hackerrank.com/contests/codestorm/challenges/game-with-a-boomerang

    上一篇博客不知怎么复制过来题目,排版惨不忍睹。。。所以这个只好直接放链接吧

    题意是n个土著人,编号1~n。围成一圈,然后从1号开始扔飞镖,如果是奇数个人的圈的话,那这个扔飞镖的人没有对应的人,扔飞镖的人淘汰。如果是偶数个人的圈的话,将对面编号淘汰。

    这样围成一圈之后,进行n-1轮,每一轮淘汰掉一个人,问最终剩下的人的编号。


    没做过这样的题,全无思路。然后上离散课的时候拿纸笔画,发现偶数n的时候就是等于奇数n-1的时候加一的情况,然后发现可以递推,奇数的时候也是有规律的。于是写了这么一个程序。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <string>
    #include <cstring>
    #pragma warning(disable:4996)
    using namespace std;
    
    typedef long long ll;
    //const int maxn = 1e18;
    
    ll n;
    //ll val[1000000000000000000];
    
    ll cal(ll x)
    {
    	ll i;
    	ll ori = 1;
    	for (i = 2; i <= x; i++)
    	{
    		if (i & 1)
    		{
    			ori = ori + 1;
    		}
    		else
    		{
    			if (ori < i / 2)
    			{
    				ori = ori + 1;
    			}
    			else
    			{
    				ori = ori + 2;
    				if (ori > i)
    				{
    					ori = ori - i;
    				}
    			}
    		}
    	}
    	return ori;
    }
    
    int main()
    {
    	//freopen("i.txt","r",stdin);
    	//freopen("o.txt","w",stdout);
    	
    	int test;
    	scanf("%d", &test);
    	
    	while (test--)
    	{
        		scanf("%lld", &n);
    		printf("%lld
    ", cal(n));
    	}
    	//system("pause");
    	return 0;
    }
    

    对了很多个test,但是tle了,我本来想也是会tle的。。。

    于是举了1000个数找规律,找到的规律就是发现了断点都是4n-2,然后每个数只跟其断点的大小有关系,剩下的也没什么了。

    做出来的时候特别高兴,但现在觉得这个题目貌似也不过如此啊。。。果然自己还是。。。。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <string>
    #include <cstring>
    #pragma warning(disable:4996)
    using namespace std;
    
    typedef long long ll;
    
    ll n;
    ll val[100];
    
    void init()
    {
    	ll i;
    	val[1] = 1;
    	for (i = 2;; i++)
    	{
    		val[i] = val[i - 1] * 4 - 2;
    		if (val[i] > 1e18)
    			break;
    	}
    }
    ll cal(ll x)
    {
    	int i;
    	for (i = 1; i <= 32; i++)
    	{
    		if (x - val[i] < 0)
    			break;
    	}
    	i--;
    
    	ll y = x - val[i];
    	ll sum;
    	ll v;
    	ll temp;
    	if (y < val[i])
    		return y + 1;
    	else
    	{
    		temp = x - 2 * val[i];
    		v = temp / 2;
    		sum = v + (v + 1) * 2;
    		if (temp & 1)
    		{
    			sum++;
    		}
    		return val[i] + sum;
    	}
    }
    int main()
    {
    	//freopen("i.txt", "r", stdin);
    	//freopen("o.txt", "w", stdout);
    
    	init();
    	int test;
    	scanf("%d", &test);
    
    	while (test--)
    	{
    		scanf("%lld", &n);
    		printf("%lld
    ", cal(n));
    	}
    	//system("pause");
    	return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    学习ESLint的规则配置,ESLint语法检测配置说明
    慎用Request.Params获取参数值
    [C#.NET 拾遗补漏]04:你必须知道的反射
    .NET Web应用中为什么要使用async/await异步编程
    Asp.Net Core Web Api 使用 Swagger 生成 api 说明文档
    网页打印尺寸设置
    Object 标签遮挡 Div 显示
    C# 之 批量插入数据到 SQLServer 中
    PrintDocument打印、预览、打印机设置和打印属性的方法
    JS 之 阻止事件冒泡,阻止默认事件,event.stopPropagation()和event.preventDefault(),return false的区别
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4928104.html
Copyright © 2011-2022 走看看