偶尔逛到这题,是2011年世界总决赛的题目,怀着一丝敬畏和期待开始看这道题目二维平面内一个多边形,可以任意旋转,使得可以将其扔进一个宽为w的槽,求w的最小值idea:开始的时候随便画了画草图,假设最后最优的情况是两个点分别在槽的两边,则一定可以绕其中的一个点旋转一个角度使得产生空隙(纸上画一画就知道了),此时的答案应该更小才是,进一步可以发现一定能够将一条边转到槽的便上,所以,有方案了。先求土包,枚举土包上的每条边,再枚举每个土包上的点,求出最大的距离,这些最大距离的最小值就是我们要的答案可惜没有1A....没有判断n为0的时候停止。。囧!View Code #include<stdio Read More
posted @ 2011-12-14 22:03 Because Of You Views(471) Comments(0) Diggs(0) Edit
给你两个数的最大公约数和最小公倍数,让你求这两个数,使得两数之和最小利用最小公倍数和最大公倍数约数的性质来解决问:为什么a*i+b/i随i的增大而减小?答:i<=sqrt(c)=sqrt(b/a),设f(i)=a*i+b/i求导:f'(i)=a-b/(i*i)因为i<=sqrt(b/a),所以f'(i)<=0所以所以i越大f(i)越小,即两个数的和就越小,所以直接从i的最大值开始枚举,一旦符合条件就输出,另外a*i也肯定是大于b/i的View Code import java.util.*;import java.io.*;import java.lang.M Read More
posted @ 2011-12-14 06:33 Because Of You Views(2159) Comments(1) Diggs(0) Edit
求小于n的孪生素数有几对。。。。暴力貌似也可以过,我用了树状数组,预处理了一下,每次输入n直接求sum(n),表示小于n的孪生素数的对数View Code #include<stdio.h>#include<string.h>#define MAX 100000int c[100000];int lowbit(int x){ return x&(-x);}void add(int x,int num){ while(x<=MAX) { c[x]+=num; x+=lowbit(x); }}int sum(int x){ int ans... Read More
posted @ 2011-12-14 05:20 Because Of You Views(277) Comments(0) Diggs(0) Edit