codeforces Round #250 (div2)

a题,就不说了吧

b题,直接从大到小排序1-limit的所有数的lowbit,再从大到小贪心组成sum就行了


 1 #include<cstdio>
2 #include<iostream>
3 #include<algorithm>
4 #include<cstring>
5 #define N 200000
6 using namespace std;
7 int pos[N],a[N],s[N],f[N],la[N],b[N],i,j,k,ans,n,p,sum,lim;
8 bool fl[N];
9 struct node{
10 int x,y;
11 }u[N];
12 int pow(int x, int n)
13 {
14 int result;
15 if (n == 0)
16 return 1;
17 else
18 {
19 while ((n & 1) == 0)
20 {
21 n >>= 1;
22 x *= x;
23 }
24 }
25 result = x;
26 n >>= 1;
27 while (n != 0)
28 {
29 x *= x;
30 if ((n & 1) != 0)
31 result *= x;
32 n >>= 1;
33 }
34 return result;
35 }
36 bool cmp(node a, node b)
37 {
38 return a.y>b.y;
39 }
40 int main()
41 {
42 scanf("%d%d",&sum,&lim);
43 for (i=1; i<=lim; i++)
44 {
45 j=i;
46 k=0;
47 while (j % 2==0)
48 {
49 ++k;
50 j=j / 2;
51 }
52 pos[k]=i;
53 u[i].x=i;
54 u[i].y=pow(2,k);
55 }
56 sort(u+1,u+lim+1,cmp);
57
58 i=1;
59 while (sum)
60 {
61 while (sum < u[i].y) i++;
62 sum-=u[i].y;
63 a[++ans]=u[i].x;
64 i++;
65 if (i > lim && sum)
66 {
67 printf("-1");
68 return 0;
69 }
70 }
71 printf("%d\n",ans);
72 for (i=1; i<=ans; i++)
73 printf("%d ",a[i]);
74 return 0;
75 }

c题,直接找每连接两端中值较小的部分


 1 #include<cstdio>
2 #include<iostream>
3 #include<algorithm>
4 using namespace std;
5 int n,m,ans,i,x,y,a[10000];
6 int main()
7 {
8 scanf("%d%d",&n,&m);
9 for (i=1; i<=n; i++)
10 scanf("%d",&a[i]);
11 for (i=1; i<=m; i++)
12 {
13 scanf("%d%d",&x,&y);
14 ans+=min(a[x], a[y]);
15 }
16 printf("%d",ans);
17 return 0;
18 }

d题,并查集处理


 1 #include<cstdio>
2 #include<iostream>
3 #include<algorithm>
4 #define N 200000
5 using namespace std;
6 typedef long long LL;
7 struct edge{
8 LL u,v,c;
9 }e[N];
10 int n,m;
11 LL f[N],s[N],x[N],i,fa,fb;
12 double sum;
13 int find(LL x){
14 if (x != f[x]) f[x]=find(f[x]);
15 return f[x];
16 }
17 bool cmp(edge a,edge b){
18 return a.c>b.c;
19 }
20 int main()
21 {
22 scanf("%d%d",&n,&m);
23 for (i=1; i<=n; i++){
24 scanf("%I64d",&x[i]);
25 f[i]=i, s[i]=1;
26 }
27 for (i=1; i<=m; i++){
28 scanf("%I64d%I64d",&e[i].u,&e[i].v);
29 e[i].c=min(x[e[i].u], x[e[i].v]);
30 }
31 sort(e+1,e+m+1,cmp);
32 for (i=1; i<=m; i++){
33 fa=find(e[i].u), fb=find(e[i].v);
34 if (fa==fb) continue;
35 sum+=(s[fa] * s[fb]) * e[i].c;
36 f[fb]=fa, s[fa]+=s[fb];
37 }
38 sum=2.0 * (sum / n) / (n-1);
39 printf("%.6lf",sum);
40 return 0;
41 }

codeforces Round #250 (div2),布布扣,bubuko.com

时间: 2024-12-23 02:56:15

codeforces Round #250 (div2)的相关文章

Codeforces Round #250 (Div. 1)

这几次CF都挺惨.. A 没条边权设为两端点的最小点权,最后加起来. 数组开小,WA一次 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #

codeforces round #257 div2 C、D

本来应该认真做这场的,思路都是正确的. C题,是先该横切完或竖切完,无法满足刀数要求,再考虑横切+竖切(竖切+横切), 因为横切+竖切(或竖切+横切)会对切割的东西产生交叉份数,从而最小的部分不会尽可能的大. 代码如下,虽然比较长.比较乱,但完全可以压缩到几行,因为几乎是4小块重复的代码,自己也懒得压缩 注意一点,比如要判断最小块的时候,比如9行要分成2份,最小的剩下那份不是9取模2,而应该是4 m/(k+1)<=m-m/(k+1)*k          #include<bits/stdc+

codeforces --- Round #250 (Div. 2) A. The Child and Homework

<传送门> 这题就是一个坑,尼玛wa了一大片啊. 自己被hack了,比赛结束后改了又wa两次才过. [题目大意] 其实就是一个猜题小技巧(联系自己初中考试的时候怎么猜题的,这题就好理解多了).这位同学是这样来选答案的:1.如果有一些选项长度至少比其他所有的描述短两倍,或至少超过所有其他的描述的两倍,那么孩子认为这个选择很可能是正确的.2.如果正好满足以上其中一种条件(重点),这个同学就会选择它,否则就选C.给你一个选择题,让你选择出这个同学将会选择的答案. [题目分析] 首先,这个题目就是一个

Codeforces Round#320 Div2 解题报告

Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Finding Team Member codeforces 579C A Problem about Polyline codeforces 579D "Or" Game codeforces 579E Weakness and Poorness codeforces 579F LCS Aga

Codeforces Round #254(div2)A

很有趣的题.想到了就非常简单,想不到就麻烦了. 其实就是一种逆向思维:最后结果肯定是这样子: WBWBWBWB... BWBWBWBW... WBWBWBWB... ... 里面有“-”的地方改成“-”就行了. 但是我开始是正着想的,想每个点怎么处理,这还要看它周围点的状态,越想越麻烦... 这题中体现的正难则反的逆向思维很值得学习. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs

Codeforces Round #254(div2)B

就是看无向图有几个连通块,答案就是2n-num. 范围很小,就用矩阵来存图减少代码量. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #inc

Codeforces Round #260(div2)C(递推)

有明显的递推关系: f[i]表示i为数列中最大值时所求结果.num[i]表示数i在数列中出现了几次. 对于数i,要么删i,要么删i-1,只有这两种情况,且子问题还是一样的思路.那么很显然递推一下就行了:f[i]=max(f[i-1],f[i-2]+i*num[i]); 这里技巧在于:为了防止麻烦,干脆就所有数的出现次数都记录一下,然后直接从2推到100000(类似于下标排序),就不用排序了,也不用模拟删除操作了.这一技巧貌似简单,但实际上临场想出来也需要点水平. #include<iostrea

Codeforces Round #289 Div2 E

Problem 给一串长度为N的字符串,对于每个字符,若字符为元音,则权值为1,否则为0.一个子串的权值定义为该串所有字符权值之和除以字符个数,一个母串的权值定义为所有子串的权值之和.求母串的权值. Limits Time Limit(ms): 1000 Memory Limit(MB): 256 N: [1, 5*10^5] 字符集: 'A'-'Z' 元音: I E A O U Y Solution 考虑每个元音字符对母串的贡献,可以找出规律. More 举"ABCDOEFGHKMN"

Codeforces Round #403 div2 C. Andryusha and Colored Balloons

题目链接:Codeforces Round #403 div2 C. Andryusha and Colored Balloons 题意: 给你一棵n个节点的树,然后让你染色,规定相连的三个 节点不能同色,问需要的最少颜色,并输出其中一种方案. 题解: 因为只有相邻3个节点不同色. 所以直接DFS,每个节点都从1开始. 然后ans[v]!=ans[u]!=ans[fa]就行. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i&