摘要:
又是数学题。每次放入一个球所得到的的分数为x1+x2(x1表示左边的球中颜色的种数,x2表示右边)其实如果一个球的数量超过了2,那么剩下的就是一个乘法了。 这个理解很简单,因为超过了2的话,说明最优的方案一定是左右各一个,不然如果都在一边的话就只得1分了。所以我们预处理出所有不超过2的情况的得分(手算吧),然后剩余的就做一个乘法就可以了。略水,开始没有保证三个数的顺序,手滑。。。。。T_T#include #include #include #include typedef long long ll;using namespace std;ll a[3][3][3];ll f[4],n,k,t 阅读全文
摘要:
题目很简单。给你n个数,输出n个答案,第i个答案表示从n个数里取遍i个数的异或值的和。其实每一个数最多也就32位,把所有的数分解,保存每一位总共有多少个1,最后要是这一位的异或结果为1,那么在所有的异或数中,这一位为1的数必须是有奇数个,在求解的时候就是求组合数的情况就可以了。直接水过。#include #include #include #define M 1000003#define maxn 1005typedef long long ll;using namespace std;int a[53];int ans,n,m,k,c[maxn][maxn],u[53];ll tep;voi 阅读全文
摘要:
题目很有意思,我想说其实我在比赛的时候就看过了一下这个题目,今天才这么快搞出来吧。其实总共按上键的次数不会超过10个,我们可以每次假设相隔按两次上键之间按了xi次下键,由于上键的次数是确定的,所以最后就是求下键的次数和最小。同时用一个等式表达出来后我们就可以发现其实是一个sigama(xi*(n/i))=y-x+1-eps(eps是为了防止后面的数字恰等于1),求sigama(xi)的和最小。显然,这里很简单了,由于系数是从大到小的,我们可以直接从大的开始填充,直到填充的剩余那个数在1的范围以内就可以了。注意这里一定要考虑精度问题。。。居然一开始用cin给T掉了,我看只有两个数输入啊,神坑啊。 阅读全文
摘要:
水题。#include #include #include using namespace std;double totsum,totnum,k;char s[5];int n;double get(){ if (s[0]=='A') { if (s[1]==0) return 4; else return 3.7; } if (s[0]=='B') { if (s[1]==0) return 3; else if (s[1]=='+') return 3.3; else return 2.7;... 阅读全文
摘要:
通过一个题目,学到了很多。题意为给你n个数,每次询问i,j,答案为i,j间任取两数所有的取法gcd的和。假设我们当前要看看这个区间有多少个数的gcd为x,最最原始的想法都是查询这个区间有多少个数为x的倍数。然后任取两个%&*¥#@!,但是有的gcd不是x,而是x的倍数。这个问题这样来考虑,其实思想上是莫比乌斯反演。假设当前我们有x个数是要求的现在的数y的倍数,那么所有的y的约数也肯定包含了这x个数。所以我们可以当前要乘以的这个数不是x,而是一个f[x],显然x的所有的约数的函数和为x,这样就保证了求解的正确性。同时想到了这里就会发现,所求的函数值与原题给的数据和各个数字的位置关系是没有 阅读全文