• luogu2765 魔术球问题


    发现好像没人来证明贪心啊……那我来写一下它的证明

    欲证明:放一个数在已有的柱上(如果可以)总是比新开一个柱更优的

    假如已经放了x1..x2....xu..xv..xw....
    现在我要放xx

    我有两种策略

    xuxu代表可以与xx组成完全平方数的数)上放,或者新开一个柱子


    x1..x2....xx..xv..xw....
    or
    x1..x2....xu..xv..xw....xx

    然后再考虑xx+1

    对于x1..x2......xv..xw....,上下两种都是一样的,就不说了

    既然xu可以与xx组成完全平方数,则xu+xx=a*a
    可以发现,xu+1+xx 不可以放在xu上面,(为什么呢?倘若可以,即xu+1+xx==b*b,即1=b*b-a*a,而b>a>=1……
    那么,xx+1还不如放在xx上哩。

    如果xx+1放在不是xx上的地方,则上面一种更优。因为倘若再来个什么xa,它大可以再开一个柱子。(有的同学可能发现这里的证明有点不完整,大概说一下,就是考虑xa放在xu上的所有柱子的形态和新开一个柱子的所有柱子的形态)。

    代码很好写啦。(据说(nleq 60)

    #include <iostream>
    #include <cstdio>
    #include <vector>
    using namespace std;
    int n, cnt, ans=1, isa[3205];
    vector<int> d[62];
    int main(){
    	for(int i=1; i*i<=3205; i++)
    		isa[i*i] = true;
    	cin>>n;
    	while(1){
    		for(int i=1; i<=cnt; i++)
    			if(isa[d[i][d[i].size()-1]+ans]){
    				d[i].push_back(ans);
    				ans++;
    				i = 0;
    				continue;
    			}
    		if(cnt<n)
    			d[++cnt].push_back(ans++);
    		else break;
    	}
    	cout<<ans-1<<endl;
    	for(int i=1; i<=n; i++){
    		for(int j=0; j<d[i].size(); j++)
    			printf("%d ", d[i][j]);
    		printf("
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    在项目中使用Google Closure Compiler
    在Dreamweaver 中设置SVN的步骤
    挣脱浏览器的束缚(2) 别让脚本引入坏了事
    Java配置环境变量
    Spring3简介
    Java开发常用地址
    struts2 入门
    Spring3 jar包说明
    角色和定位
    QCon 2011参会收获——其它
  • 原文地址:https://www.cnblogs.com/poorpool/p/8135953.html
Copyright © 2020-2023  润新知