摘要:题解: 该题与hdu1003一模一样。代码如下:#include <stdio.h>int main(){ int n, m, i, stone, L, R, bL; __int64 sum, bsum; scanf("%d", &n); while (n--) { scanf("%d", &m); sum = -4444; //initialization sum bsum = 0; //sum in buffer bL = 1; //L of the buffer sum fo...
阅读全文
摘要:题解: 数学题,等差数列的运用。Sn = (a1+an) * n / 2 = (a1 + a1 + (n - 1) * d)*n/2。解题公式变形:(a+a+len)*(len+1)/2 = m => a = m/(len+1)-len/2 (m是已知条件,len的最大值为√(2*m)代码如下:#include <stdio.h>#include <math.h>int main(){ int n, m, a, len; while (scanf("%d%d", &n, &m) && (n || m)) { le
阅读全文
摘要:题解: 用到异或的知识,a^a = 0, a^0 = a. 因为题目中说道你的礼物的号码有奇数个,其它的号码有偶数个。把每个数用异或符连接起来,运算号就剩下一个本来奇数个的号码了。例如a^b^c^c^b^a^c = a^a^b^b^c^c^c = 0^0^0^c = c(a, b, c代表任意整数)代码如下:#include <stdio.h>int main(){ int n, m, present; while (scanf("%d", &n) && n) { present = 0; while (n--) { ...
阅读全文
摘要:题解: 题中有两群人,前面的一群人看成是冠军候选人,后面的一群人看成不可能成为冠军的人,如果冠军候选人同时出现在另一个群里,则将该冠军候选人踢出冠军候选人群。最后冠军候选人群中如果仅剩下一人,则这个人就是冠军,否则没有冠军。代码如下:#include <stdio.h>#include <string.h>typedef struct Player{ char win[20], lose[20];//最好写成20,第一次写10的时候没有通过}player;int main(){ int n, i, j, ok; char tmp[20]; player ply[100.
阅读全文
摘要:题解: 细节题,题目中说的A 和B 都能用int 表示,但是A+B可能超出int 的范围,还有一点不严谨的地方就是如果是100的话,应输出 00 啊,还是 0 啊。本题按输出的是0来做。代码如下:#include <stdio.h>int main(){ __int64 n, a, b; scanf("%I64d", &n); while (n--) { scanf("%I64d%I64d", &a, &b); printf("%I64d\n", (a + b) % 100); } return 0
阅读全文
摘要:题解: 比较简单,求各个位数之和。代码如下:#include <stdio.h>int main(){ int n, tmp, sum1, sum2, sum3; while (scanf("%d", &n) && n) { sum1 = sum2 = sum3 = 0; tmp = n; while (tmp) {//十进制各个数位和 sum1 += tmp % 10; tmp /= 10; } tmp = n; while (tmp...
阅读全文
摘要:题解: 该题主要是理解题意,将一个偶数拆分成两个不同素数的和。代码如下:#include <stdio.h>#include <math.h>int IsPrime(int n){ int i; for (i=2; i<=sqrt(n); i++) { if (n % i == 0) return 0; } return 1;}int main(){ int n, i, cnt; while (scanf("%d", &n) && n) { cnt = 0; for (i=3; i<...
阅读全文
摘要:题解: 主要是对尾数 00 01 02 03 .... 09 的处理。反正后两位数总共只有100个,就用的枚举的方法。代码如下 #include <stdio.h>int main(){ int a, b, first, t, i; while (scanf("%d%d", &a, &b) && (a || b)) { a *= 100; first = 1; for (i=a; i<a+100; i++) { if (i % b == 0) { ...
阅读全文
摘要:题解: 简单数学题,但是细节就太重要了,注意面积为零的情况,最最该注意的是题中给出的对角线上的点是主对角线或副对角线上的,我就是因为一直认为它给出的都是主对角线上的点错了好多次。基本步骤是先将给出的点转换成主对角线上的点,即用主对角线的两个点表示矩形,再确定重叠部分(假设存在)矩形的主对角线的两个点坐(x1,y1)(x2,y2)如果x2-x1<0 或 y2-y1<0,那么假设不成了,重叠部分为零(输出时应输出0.00)。代码如下:#include <stdio.h> void change(double *x1, double *y1, double *x2, doub
阅读全文
摘要:题解: 图的线面关系,若有n条直线,最多(每条直线都不过交点)能将平面分割成1+1+2+3+4+5+6+7+8+9+10+11+12+...+n=(n^2+n)/2+1部分。将折线看成直线,n条折线相当于2n条直线,构成2*n^2 + n + 1个面。将n交点处多出的2*n个面减去就是n条折线分割平面最多部分。代码如下:#include <stdio.h> int main()
{ int n, m; scanf("%d", &m); while (m--) { scanf("%d", &n); printf("%d
阅读全文
摘要:题解: 乍一看以为是个模拟题,但是仔细看了一下题意,才发现最大数字是15位,没有超过 __int64 能表达的最大数。__int64 最大能表示16位十六进制数。所以直接进行加减就行了,需要注意的是输入输出的格式以及十六进制表达负数的时候显示的是补码。代码如下:#include <stdio.h> int main()
{ __int64 n, m, tmp; while (scanf("%I64X %I64X", &n, &m) != EOF) { tmp = m + n; if (tmp >= 0) printf("%I64X
阅读全文
摘要:题解: 简单模拟题,但是该题穷举的话太浪费时间和空间了。由给出的例子, Consider the second test case: The initial condition : 0 0 0 0 0 …
After the first operation : 1 1 1 1 1 …
After the second operation : 1 0 1 0 1 …
After the third operation : 1 0 0 0 1 …
After the fourth operation : 1 0 0 1 1 …
After the fifth operation ...
阅读全文
摘要:题解: 简单模拟题,不解释。代码如下:#include <stdio.h> void print1(int n)
{ int i; printf("+"); for (i=0; i<n; i++) printf("-"); printf("+\n");
} void print2(int n)
{ int i; printf("|"); for (i=0; i<n; i++) printf(" "); printf("|\n");
}
int main
阅读全文
摘要:题解: 简单数制转换,递归实现,不解释。代码如下:#include <stdio.h> void func(int n)
{ if (n == 0) return; if (n % 2 == 1) { func(n/2); printf("1"); } else { func(n/2); printf("0"); }
} int main()
{ int n; while (scanf("%d", &n) != EOF) { func(n); printf("\n"); } return 0;
阅读全文
摘要:题解: 此题属于递推题,和hdu2048思路是一样的,不同的是先将不用跪搓板的新郎挑出,有B = n! / ((n-m)! * m!)个,再将跪搓板的新郎A = A[m](这与hdu2048算法一样)个。总的个数为A*B个。同样要记得用 __int64 开数组A[], B[]。 代码如下:#include <stdio.h> __int64 fact(int n)
{ if (n <= 1) return 1; else return n*fact(n-1);
} int main()
{ int i, n, m, C; __int64 A[21] = {0, 0, 1},.
阅读全文
摘要:题解:代码如下:#include <stdio.h>__int64 A[51][30], B[51];int main(){ int n, i, j; for (i=0; i<=50; i++) A[i][0] = 1; for (i=2; i<=50; i++) { for (j=1; j<i/2+1; j++) A[i][j] = A[i-2][j-1] + A[i-1][j]; } for (i=1; i<=50; i++) { for (j=0; j<30; j++) B[i] += A[i][j]; } while (scanf("
阅读全文
摘要:题解: 简单递推题,如图:从A4开始,分两类讨论:1、A4的第3个与A4的第1个颜色相同 2、第3个与第1个颜色不相同。第1类情况A4相当于A2*2,这里的2相当于外加另外两种颜色中的一种;第2类情况A4相当于A3,因为首尾颜色不相同,第1个与第3个颜色不同,那么第4个只有1种颜色可以选择。依次类推,可得余下的数据。因为有50个方框,得用long long int 能存储。 需要注意的是while (scanf("%d", &n) != EOF)不能写成while (scanf("%d", &n)),因为后者可能导致无限循环。代码如下:#
阅读全文
摘要:题解: 本题主要思路是,算出i个人的总选择数a和以悲剧结尾的总选择数b,然后b/a,完成。属于递推题:图中横杠代表人,竖杠代表签名。Ai代表i个人共有A[i]个选择,Bi起过度作用。因为最多有20人,可将这20个数据存储到数组中以备调用。 这样很容易得到递推式:B[i] = A[i-2] + (n-2) * B[i-1], A[i] = (i-1) * B[i];代码如下:#include <stdio.h> __int64 fact(int n)
{ __int64 ft = n; while (--n) { ft *= n; } return ft;
} int main...
阅读全文
摘要:题解:贪心法 选择不相交区间 先将所有的电视节目按照结束时间的早晚排序,排好序后,第一个节目是必须选的,因为他结束时间最早,最不可能与其他节目重叠。将该节目和与它重叠的节目删除(这样写是为了好理解,写程序是可以不删除),那么剩下的节目的第一个节目就成了必选节目,再删除,再选......一直到没有节目为止,就可得到正解。 代码如下:#include <cstdio>
#include <algorithm> typedef struct TV
{ int Ti_s, Ti_e; bool operator <(const TV & x)const {//为了
阅读全文
摘要:题解: 递推题,从a到b可以看成从1到b-a过程求解,因为只有50个数据可以包存到数组中,需要注意的是数组得开long long 整形,vc中__int64 。代码如下#include <stdio.h> __int64 A[51]; int main()
{ int n, a, b; int i; A[1] = 1; A[2] = 2; for (i=3; i<51; i++) A[i] = A[i-1] + A[i-2]; scanf("%d", &n); while (n--) { scanf("%d%d", &a
阅读全文
摘要:假设你的月收入只有2000元,你也可以过得很好。我帮你把钱分成五份。第一份600元,第二份400元,第三份300元,第四份200元,第五份500元。第一份,用来做生活费。这么少的生活费,每天只能够分到十几元。早餐一份煮米丝,一个鸡蛋,一杯豆浆。中餐一份快餐,一个水果。晚餐自己开个小灶,煮点饭,加俩菜,睡前一杯奶。这样一月的伙食大概是500-600。不过,如果你还年轻,身体暂时还没有太多问题,这样的食谱,够你数年内不会有健康问题。第二份,用来交朋友,扩大你的人际圈。这就宽裕了。你的电话费可以用掉100元。每个月可以请客两次,每次150元。请谁呢?记住,请比你有思想的人,比你更有钱的人,和你需要感
阅读全文
摘要:vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为了使用vector 我们必须包含相关的头文件 :#include <vector>使用vector有两种不同的形式,即所谓的数组习惯和STL习惯。一、数组习惯用法1. 定义一个已知长度的 vector :vector< int > ivec( 10 ); //类似数组定义int ia[ 10 ];可以通过ivec[索引号] 来访问元素使用 if ( ivec.empty() ) 判断是否是空,ivec.size()判断元素个数。2. vector的
阅读全文