第三次月赛题解

1000

每天只要复习收益最大的那门课即可

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 #pragma warning(disable:4996)
15 typedef long long LL;
16 const int INF = 1<<30;
17 /*
18 */
19 const int N = 100 + 10;
20 int dp[N][N];
21 int a[N][N];
22 char in[] = "D:\\3\\1004\\0.in";
23 char out[] = "D:\\3\\1004\\0.out";
24 char str[] = "0123456789";
25 int main()
26 {
27     //for (int z = 0; z <= 9; ++z)
28     {
29         //in[10] = str[z];
30         //out[10] = str[z];
31         //freopen(in, "r", stdin);
32         //freopen(out, "w", stdout);
33         int n, m;
34         while (scanf("%d%d", &n, &m) != EOF)
35         {
36             for (int i = 1; i <= n; ++i)
37             {
38                 for (int j = 1; j <= m; ++j)
39                     scanf("%1d", &a[i][j]);
40             }
41
42             int ans = 0;
43             for (int i = 1; i <= n; ++i)
44             {
45                 sort(a[i] + 1, a[i] + n + 1);
46                 ans += a[i][n];
47             }
48             printf("%d\n", ans);
49         }
50     }
51     return 0;
52 }

1001

个位数的位数是1,十位的是2, 所以只要算出个位数的个数*1,加上十位数的个数*2,加....

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 #pragma warning(disable:4996)
15 typedef __int64 LL;
16 const int INF = 1 << 30;
17 /*
18
19 */
20 char in[] = "D:\\3\\1000\\0.in";
21 char out[] = "D:\\3\\1000\\0.out";
22 char str[] = "0123456789";
23 int main()
24 {
25     //for (int z = 0; z <= 9; ++z)
26     {
27         //in[10] = str[z];
28         //out[10] = str[z];
29         //freopen(in, "r", stdin);
30         //freopen(out, "w", stdout);
31         LL n;
32         while (scanf("%I64d", &n) != EOF)
33         {
34             char str[11];
35             LL m = 1;
36             sprintf(str, "%I64d", n);
37             LL len = strlen(str);
38             LL ans = 0;
39             LL t = 9;
40             LL i = 0;
41             for (i = 0; i < len - 1; ++i)
42             {
43                 ans = ans + t * (i + 1);
44                 t *= 10;//位数为i+1的数字有多少个
45                 m = m * 10;
46             }
47             ans += (i + 1) * (n - m + 1);
48             printf("%I64d\n", ans);
49             //puts("8888888899");
50         }
51     }
52
53     return 0;
54 }

1002

ABC三根柱子

设T(n)是将n个盘子借助一根柱子移到另一个柱子上去所要移动的最小次数, 那么要先将n-1个盘子移到B柱子上去,需要T(n-1)次,然后将第n个盘子移到C柱子上去,需要一次,然后将n-1个盘子移动C柱子上去

需要T(n-1)次, 所以T(n) = 2*T(n-1) + 1

设T(n)+1 = 2( T(n-1)+1 )  = 2 * 2( T(n-2)+1) = ... = 2^n    所以T(n) = 2^n - 1

需要注意的是2^64 会爆

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 #pragma warning(disable:4996)
15 typedef unsigned __int64 LL;
16 const int INF = 1<<30;
17 /*
18
19 */
20 char str[] = "0123456789";
21 char addressIn[] = "D:\\3\\1001\\1.in";
22 char addressOut[] = "D:\\3\\1001\\1.out";
23 int main()
24 {
25     int n;
26     LL ans;
27     //for (int i = 0; i < 9; ++i)
28     {
29         //addressIn[10] = str[i];
30         //addressOut[10] = str[i];
31
32         //freopen(addressIn, "r", stdin);
33         //freopen(addressOut, "w", stdout);
34         while (scanf("%d", &n) != EOF)
35         {
36             ans = 0;
37             if (n == 0)
38             {
39                 puts("0");
40                 continue;
41             }
42             else if (n == 64)
43                 ans = 0;
44             else
45             {
46                 ans = 1;
47                 ans <<= n;
48             }
49             ans -= 1;
50             printf("%I64u\n", ans);
51         }
52     }
53     return 0;
54 }

1003

根据异或的性质,  a^a = 0      a^a^a = a ,  所以将n个数字进行异或, 如果结果是0,说明所有的数字都出现了偶数次, 如果结果不为0,那么就输出

需要注意的是,如果a为0,切出现了奇数次, 其异或结果也是0 ,  所以异或时将每个数字加1即可

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 #include<time.h>
14 using namespace std;
15 #pragma warning(disable:4996)
16 typedef long long LL;
17 const int INF = 1<<30;
18 /*
19
20 */
21 __int64 input()
22 {
23     char ch = getchar();
24     while (ch<‘0‘ || ch>‘9‘)
25         ch = getchar();
26     __int64 x = 0;
27     while (ch >= ‘0‘ && ch <= ‘9‘)
28     {
29         x = x * 10 + ch - ‘0‘;
30         ch = getchar();
31     }
32     return x;
33 }
34 const LL MAX = 1152921504606846976LL;
35 LL a[5000000+10];
36 char in[] = "D:\\3\\1002\\0.in";
37 char out[] = "D:\\3\\1002\\0.out";
38 char str[] = "0123456789";
39 int main()
40 {
41     int n;
42     //for (int k = 0; k <= 9; ++k)
43     {
44         //in[10] = str[k];
45         //freopen(in, "r", stdin);
46         //freopen("D:\\3\\1002\\0.out", "w", stdout);
47
48         while (scanf("%d",&n)!=EOF)
49         {
50             LL ans = 0, x;
51             for (int i = 0; i < n; ++i)
52             {
53                 //scanf("%I64d", &a[i]);
54                 //input(a[i]);
55                 a[i] = input();
56                 a[i]++;
57                 ans ^= a[i];
58             }
59             //sort(a, a + n);
60             printf("%I64d\n", ans==0?-1:ans-1);
61         }
62     }
63     return 0;
64 }

1004

这个问题难点是不知道要打扫哪几列, 其实只要我们枚举每一行,使得这一行全为1, 那么就知道了要打扫哪几列,  然后判断剩下的n-1行,看打扫了这几列之后是否全为1

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 #pragma warning(disable:4996)
15 typedef long long LL;
16 const int INF = 1 << 30;
17 /*
18
19 */
20 const int N = 101;
21 char a[N][N];
22 int ans;
23 int vis[N];
24 char in[] = "D:\\3\\1005\\9.in";
25 char out[] = "D:\\3\\1005\\9.out";
26 char str[] = "0123456789";
27 int main()
28 {
29
30     //for (int z = 0; z <= 9; ++z)
31     {
32         //in[10] = str[z];
33         //out[10] = str[z];
34         //freopen(in, "r", stdin);
35         //freopen(out, "w", stdout);
36         int n;
37         while (scanf("%d", &n) != EOF)
38         {
39             memset(vis, 0, sizeof(vis));
40             for (int i = 0; i < n; ++i)
41                 scanf("%s", a[i]);
42
43             ans = 0;
44             for (int i = 0; i < n; ++i)
45             {
46                 bool flag = true;
47                 for (int j = 0; j < n; ++j)
48                 if (a[i][j] == ‘0‘)
49                 {
50                     flag = false;
51                     break;
52                 }
53                 if (flag)
54                     ans++;
55             }
56             int tmp;
57             for (int i = 0; i < n; ++i)
58             {
59                 memset(vis, 0, sizeof(vis));
60                 for (int j = 0; j < n; ++j)
61                 {
62                     if (a[i][j] == ‘0‘)
63                         vis[j] = true;
64                 }
65                 tmp = 1;
66                 for (int j = 0; j < n; ++j)
67                 {
68                     if (i == j) continue;
69                     bool f = true;
70                     for (int k = 0; k < n; ++k)
71                     if (a[j][k] == ‘0‘ && !vis[k])
72                     {
73                         f = false;
74                         break;
75                     }
76                     else if (a[j][k] == ‘1‘ && vis[k])
77                     {
78                         f = false;
79                         break;
80                     }
81                     if (f)
82                         tmp++;
83                 }
84                 ans = ans > tmp ? ans : tmp;
85             }
86             printf("%d\n", ans);
87         }
88     }
89     return 0;
90 }

1005

点这里

时间: 2024-11-15 00:45:50

第三次月赛题解的相关文章

USACO银组12月月赛题解

USACO银组12月月赛题解 Convention 题面 一场别开生面的牛吃草大会就要在Farmer John的农场举办了! 世界各地的奶牛将会到达当地的机场,前来参会并且吃草.具体地说,有N头奶牛到达了机场(1≤N≤105),其中奶牛i在时间ti(0≤ti≤109)到达.Farmer John安排了M(1≤M≤105)辆大巴来机场接这些奶牛.每辆大巴可以乘坐C头奶牛(1≤C≤N).Farmer John正在机场等待奶牛们到来,并且准备安排到达的奶牛们乘坐大巴.当最后一头乘坐某辆大巴的奶牛到达的

多校联赛第三场(部分题解)

1001. Magician (hdu5316) 这个题目用到线段树来合并区间,题目有句话的意思A beautiful subsequence is a subsequence that all the adjacent pairs of elves in the sequence have a different parity of position说的是相邻的两个元素必须有不同的奇偶位置,所有一个序列有四种可能的形式,奇...奇, 奇...偶,偶...奇, 偶...偶,这四种形式只是端点的奇

第三次周赛题解【并查集 KMP DFS BFS 快速幂】

问题 A: 一道签到题 时间限制: 2 Sec  内存限制: 128 MB 提交: 63  解决: 28 [提交][状态][讨论版] 题目描述 我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数.循环节以及循环节长度 输入 输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100 输出 分别输出这个小数的循环节的长度.循环节以及循环次数,中间以

FOJ 11月月赛题解

抽空在vjudge上做了这套题.剩下FZU 2208数论题不会. FZU 2205 这是个想法题,每次可以在上一次基础上加上边数/2的新边. 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <string> 5 #include <string.h> 6 #include <stdio.h> 7 #include <queue

省选模拟三十四 题解

T1 假如max(a)<0的话直接把所有的a排个序贪心选择大的尽量多 现在考虑一个正的ai对后面的影响 维护一个大根堆,a<0就往里添,a>=0就去抵消堆顶元素 这样新序列(堆里的元素)就可以像刚才那样做了 T2 先把点按权值从大到小排序 然后枚举那个点可以选也可以不选 前面的都已经选了 然后在当前枚举的颜色中优先选择那些到根的路径上权值合法的 更新答案 因为如果要是想往小枚举的话一定要选择完当前颜色 所以把当且颜色全部连到根上后还需要额外的考虑中间小于当且权值的点 就是一个递归模拟 最

省选模拟三十五题解

昨天出去浪,今天发烧,考试虚的一批,暴力挂了2个,T3的性质猜出来了但是只打了50分,没有时间打满分 T1 假设现在删蓝树,in[x]代表dfs到x的最小时间戳,out代表最大 那么一条原先删的边(p,q)会让蓝树里的(x,y)删掉当: (假设dfn[x]<dfn[y],dfn[p]<dfn[q]) 1>in[q]=<in[x]<=out[q]&&in[y]>out[q] 2>in[q]=<in[y]<=out[q]&&

【小白入门向】tarjan算法+codevs1332题解报告

一.[前言]关于tarjan tarjan算法是由Robert Tarjan提出的求解有向图强连通分量的算法. 那么问题来了找蓝翔!(划掉)什么是强连通分量? 我们定义:如果两个顶点互相连通(即存在A到B和B到A的通路),则称这两个点强连通.对于一个有向图G,若是G中任意两点都强连通,则称G是一个强连通图.有向图的极大强连通子图,称为该图的强连通分量. 对于下图,{1,2,3,4}.{5}.{6}分别是它的强连通分量. 那么tarjan是如何找到这些强连通分量的呢? 说白了tarjan就是dfs

暑假娱乐赛&#183;题解

由于出题人的疏忽,导致T2和T3分别有一个数据造错,造成了大家不必要的麻烦,对此十分抱歉. 这里写一下三道题的题解: A--LJJ爱数数 题目链接:https://www.luogu.org/problemnew/show/U32290 题目简述:求出有多少个正整数三元组{a,b,c},满足a,b,c<=n,a,b,c三个数的最大公约数为1,且1/a+1/b=1/c. 数据范围:n<=1e12 tag:本题原型来自中等数学2011年第1期,进行了一番改编. 20分:枚举a,b,O(1)算出c,

初级阶段算法之递归算法

一:递归的概念 在一个函数中再次调用该函数自身的行为叫做递归,这样的函数被称作递归函数.需要注意的是,递归函数中的参数或者函数中的某一变量的值肯定会改变,若不改变,则函数在自己调用自己的过程中,没有标志函数停止的标志,函数会陷入死循环. 如:void digui1(){  printf("a\n");  }      void digui2(){ digui1(); }; 在主函数中调用函数digui2()时,函数会陷入死循环. 二.递归的具体执行顺序 请看博客   http://ww