Codeforces Round #511 (Div. 2)

又到了摸鱼的时候了23333

A. Little C Loves 3 I

题意:给一个数,分解为不被3整除的3个数

题解:构造,如果这个数被3整除,就构造为1,1,n-2;否则构造为1,2,n-3

 1 class Solution(object):
 2     def run(self):
 3         n = int(input())
 4         if n % 3 == 0:
 5             print(1, 1, n - 2)
 6         else:
 7             print(1, 2, n - 3)
 8
 9 if __name__ == ‘__main__‘:
10     Solution().run()

B. Cover Points

题意:用一个直角边为xy轴的等腰三角形覆盖坐标系上的点,问直角边长度

题解:不是等腰还有点意思,等腰就是大水题

 1 class Solution(object):
 2     def run(self):
 3         n = int(input())
 4         res = 0
 5         for _ in range(n):
 6             p = [int(x) for x in input().split(‘ ‘)]
 7             x, y = p[0], p[1]
 8             res = max(res, x + y)
 9         print(res)
10
11 if __name__ == ‘__main__‘:
12     Solution().run()

C. Enlarge GCD

题意:从n个数中去掉x个,使GCD严格增大,求x的最小值

题解:将所有数的因子计数,记做cnt[],cnt[k] 表示有因子 k 的数的个数;很显然,当 k0 为所有数的gcd时,cnt[k0] 应该为 n;不难想出,留下的数的个数应该为 cnt[] 中第二大的那一个,Sure,第一大的是 cnt[k0] = n

Python读入就超时了 TvT

 1 #include <iostream>
 2 #include <vector>
 3 #include <cmath>
 4
 5 std::vector<int> a((int)3e5+1), cnt((int)2e7);
 6
 7 int main()
 8 {
 9     int n, mx = -1, mxx = -1;
10     std::cin >> n;
11     for (auto i = 0; i < n; i++)
12     {
13         std::cin >> a[i];
14         mxx = std::fmax(mxx, a[i]);
15         for (auto j = 1; j * j <= a[i] && n * j < (int)1.5e7 + 1; j++)
16             if (a[i] % j == 0)
17             {
18                 cnt[j]++;
19                 if (j * j != a[i])
20                     cnt[a[i] / j]++;
21             }
22     }
23     for (auto i = 2; i <= mxx; i++)
24         if (cnt[i] < n)
25             mx = std::fmax(mx, cnt[i]);
26     if (mx > 0)
27         std::cout << n - mx << std::endl;
28     else
29         std::cout << -1 << std::endl;
30     return 0;
31 }

D. Little C Loves 3 II

题意:在一个n*m的棋盘里,尽可能多地放入曼哈顿距离为3的棋子对,问最多能放几个棋子

题解:分类讨论,然后总结一下,这题相当水

 1 class Solution(object):
 2     def run(self):
 3         n, m = [int(x) for x in input().split()]
 4         if n > m:
 5             n, m = m, n
 6         res = (n * m) // 2
 7         if n == 1 and (m + 1) % 6 // 3:
 8             res -= 1
 9         elif n == 2:
10             if m == 2:
11                 res = 0
12             elif m == 3:
13                 res = 2
14             elif m == 7:
15                 res = 6
16         print(res * 2)
17
18 if __name__ == ‘__main__‘:
19     Solution().run()

E

摸了

原文地址:https://www.cnblogs.com/hexsix/p/9690399.html

时间: 2024-10-10 02:35:21

Codeforces Round #511 (Div. 2)的相关文章

Codeforces Round #511 (Div. 2)-C - Enlarge GCD (素数筛)

传送门:http://codeforces.com/contest/1047/problem/C 题意: 给定n个数,问最少要去掉几个数,使得剩下的数gcd 大于原来n个数的gcd值. 思路: 自己一开始想把每个数的因子都找出来,找到这些因子中出现次数最多且因子大于n个数的最大公约数的,(n - 次数 )就是答案.但是复杂度是1e9,差那么一点. 自己还是对素数筛理解的不够深.这道题可以枚举素数x,对于每个x,找到所有(a[i]/gcd(all)) 是x倍数的个数,就是一个次数.找这个次数的过程

Codeforces Round #511 (Div. 2) C. Enlarge GCD

题目链接 题目就是找每个数的最小素因子,然后递归除,本来没啥问题,结果今天又学习了个新坑点. 我交了题后,疯狂CE,我以为爆内存,结果是,我对全局数组赋值, 如果直接赋值,会直接在exe内产生内存,否则只会在运行时才分配内存. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 1e7 + 5e6 + 10; 5 6 //线性素数筛 7 int prime[2000000],num_prime = 0;

A. Little C Loves 3 I Codeforces Round #511 (Div. 2) 【数学】

题目: Little C loves number ?3? very much. He loves all things about it. Now he has a positive integer nn. He wants to split nn into 3 positive integers a,b,ca,b,c, such that a+b+c=na+b+c=n and none of the 3 integers is a multiple of 3. Help him to fin

C. Enlarge GCD Codeforces Round #511 (Div. 2)【数学】

题目: Mr. F has nn positive integers, a1,a2,-,an. He thinks the greatest common divisor of these integers is too small. So he wants to enlarge it by removing some of the integers. But this problem is too simple for him, so he does not want to do it by

Codeforces Round 511 Div.1 B

Description Given a \(n \times m\) chessboard, every time put two chessman with Manhattan distance 3 between them. Calculate the maximum number of chessmen you can put on it. \(n, m \le 10^9\). Solution All possible pairs of position is a biparite gr

Codeforces Round #511 (Div. 2) C. Enlarge GCD (质因数)

题目 题意: 给你n个数a[1]...a[n],可以得到这n个数的最大公约数, 现在要求你在n个数中 尽量少删除数,使得被删之后的数组a的最大公约数比原来的大. 如果要删的数小于n,就输出要删的数的个数, 否则输出 -1 . 思路: 设原来的最大公约数为 g, 然后a[1]...a[n]都除以g ,得到的新的a[1]...a[n],此时它们的最大公约数一定是1 . 设除以g之后的数组a为: 1    2    3     6      8   10  则它们的质因数分别是:  1    2   

Codeforces Round #511 (Div. 1)

A - Enlarge GCD 题意:给n个数,那么他们有gcd,去掉最多n-1个数使得他们的gcd变大.求去掉最少的数. 题解:首先如果所有数都相等,那么无解.否则一定有解:最多去掉只剩下最大的那个.gcd是没有影响的,可以直接除掉(注意gcd可以用0来初始化,0和x的gcd都等于x).然后除去gcd之后每个数有他独特的几种因子,把不含这种因子的数都去掉就可以把这种因子释放出来.暴力sqrt分解会T掉,线性筛/埃筛预处理出每个数的最小质因子(甚至不需要预处理出他的幂,反正除一除也是log级别的

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿