[Codeforces] Round #320 (Div.2)

1、前言

虽然这次我依旧没有参加正式比赛,但是事后还是看了看题目的。。。一般不怎么刷Codeforces。

A、Raising Bacteria

You are a lover of bacteria. You want to raise some bacteria in a box.

Initially, the box is empty. Each morning, you can put any number of bacteria into the box. And each night, every bacterium in the box will split into two bacteria. You hope to see exactly x bacteria in the box at some moment.

What is the minimum number of bacteria you need to put into the box across those days?

>Input

The only line containing one integer x (1 ≤ x ≤ 109).

>Output

The only line containing one integer: the answer.

>Sample test(s)

input

5

output

2

input

8

output

1

>Note

For the first sample, we can add one bacterium in the box in the first day morning and at the third morning there will be 4 bacteria in the box. Now we put one more resulting 5 in the box. We added 2 bacteria in the process so the answer is 2.

For the second sample, we can put one in the first morning and in the 4-th morning there will be 8 in the box. So the answer is 1.

题解:找出所给数中包含多少个2^k(k∈[1,30])即可。

-------------------------------------------------------------------------------------------

#include<cstdio>

int n,tot;

int main()
{
  scanf("%d",&n);
  for (int i=1<<30;i>=1;i>>=1) if (n>=i) n-=i,tot++;
  printf("%d",tot);
  return 0;
}

-------------------------------------------------------------------------------------------

B、Finding Team Member

There is a programing contest named SnakeUp, 2n people want to compete for it. In order to attend this contest, people need to form teams of exactly two people. You are given the strength of each possible combination of two people. All the values of the strengths aredistinct.

Every contestant hopes that he can find a teammate so that their team’s strength is as high as possible. That is, a contestant will form a team with highest strength possible by choosing a teammate from ones who are willing to be a teammate with him/her. More formally, two people A and B may form a team if each of them is the best possible teammate (among the contestants that remain unpaired) for the other one.

Can you determine who will be each person’s teammate?

>Input

There are 2n lines in the input.

The first line contains an integer n (1 ≤ n ≤ 400) — the number of teams to be formed.

The i-th line (i > 1) contains i - 1 numbers ai1, ai2, ... , ai(i - 1). Here aij (1 ≤ aij ≤ 106, all aij are distinct) denotes the strength of a team consisting of person i and person j (people are numbered starting from 1.)

>Output

Output a line containing 2n numbers. The i-th number should represent the number of teammate of i-th person.

>Sample test(s)

input

261 23 4 5

output

2 1 4 3

input

34870603831 161856845957 794650 97697783847 50566 691206 498447698377 156232 59015 382455 626960

output

6 5 4 3 2 1

>Note

In the first sample, contestant 1 and 2 will be teammates and so do contestant 3 and 4, so the teammate of contestant 1, 2, 3, 4 will be2, 1, 4, 3 respectively.

题解:求得所有对的默契值,从大到小排序,然后一一配对,如果已经配对过则跳过。

-------------------------------------------------------------------------------------------

#include<cstdio>
#include<algorithm>
#define MAXN 320005
using namespace std;

struct Num
{
  int val,x,y;
};
Num a[MAXN];

struct Cmp
{
  bool operator () (Num a,Num b)
  {
    return (a.val>b.val);
  }
};
Cmp x;

int n,tot,ans[810];

int main()
{
  scanf("%d",&n);
  for (int i=2;i<=2*n;i++)
  for (int j=1;j<=i-1;j++) scanf("%d",&a[++tot].val),a[tot].x=i,a[tot].y=j;
  sort(a+1,a+tot+1,x);
  for (int i=1;i<=tot;i++)
  {
    if (ans[a[i].x] || ans[a[i].y]) continue;
    ans[a[i].x]=a[i].y,ans[a[i].y]=a[i].x;
  }
  for (int i=1;i<=2*n;i++) printf("%d ",ans[i]);
  return 0;
}

-------------------------------------------------------------------------------------------

C. A Problem about Polyline

There is a polyline going through points (0, 0) – (x, x) – (2x, 0) – (3x, x) – (4x, 0) – ... - (2kx, 0) – (2kx + x, x) – ....

We know that the polyline passes through the point (a, b). Find minimum positive value x such that it is true or determine that there is no such x.

>Input

Only one line containing two positive integers a and b (1 ≤ a, b ≤ 109).

>Output

Output the only line containing the answer. Your answer will be considered correct if its relative or absolute error doesn‘t exceed 10 - 9. If there is no such x then output  - 1 as the answer.

>Sample test(s)

input

3 1

output

1.000000000000

input

1 3

output

-1

input

4 1

output

1.250000000000

>Note

You can see following graphs for sample 1 and sample 3.

题解:首先可以确定的是,该函数由y=x延伸而来。因为点在直线上,显然b<a无解;否则分为两种情况,一种是点(a,b)在斜率为1的线上,那么这个线段过(a-b,0)这个点,同理如果在斜率为-1的线上,那么这个线段过(a+b,0)这个点。

-------------------------------------------------------------------------------------------

#include <cstdio>

int a,b;

int main()
{
  scanf("%d %d",&a,&b);
  if (a<b) printf("-1");
  else printf("%.12f\n",(a+b)/(2.0*((a+b)/(2*b))));
  return 0;
}

-------------------------------------------------------------------------------------------

时间: 2024-10-09 14:40:17

[Codeforces] Round #320 (Div.2)的相关文章

Codeforces Round #320 (Div. 2) &quot;Or&quot; Game(好题,贪心/位运算/前缀后缀或)

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std; 6 typedef long long ll; 7 /* 8 n个数,你最多有k次操作,每次操作可以选择一个数乘以x,问所有数或(|)的最大值 9 贪心思路:选一个数进行k此乘以x操作; 因为x>=2 10 111 ---> 1111 11

codeforces Round #320 (Div. 2) C. A Problem about Polyline(数学)

解题思路: 我们可以发现这样的一个规律: (1)首先b一定要小于a,否则无论如何曲线也无法通过(a,b); (2)设int k=a/b, 如果k为奇数,说明这个点在上图的绿色的线上, 没关系,我们让 k+=1:这样的话一定有(0,0), (a,b)这两点确定的直线的 斜率1/k介于(1/(k-1),  1/(k+1))之间,那么我们可以通过缩小(或者放大)X的值,使得第 k/2 个周期块 斜率为-1的那条边经过(a, b).此时 的X值就是最小的! (3)如果(a,b)在第 k/2 个周期块 斜

Codeforces Round #320 (Div. 2) [Bayan Thanks-Round]

一部分题解,算是自己SB了 上午的TC 也是这样 写好了代码,却一直没注意细节,然后以为错了. 此处省100字,ps 貌似紫了,作为一个老菜鸡,终于紫了 A,B 都是语文题 C: 给以一个三角形一样的图,判断点(a,b)是否在图中,我是这样判断的: 前一半是k*2*x+b=a;求最小的x,这里二分,但是注意k=0,所以你特判掉: 后一半是:2*(k+1)=a+b;二分类似 D:坐等官方题解,不靠谱系列:我试了很多方法: 做法:只可能是一个数*x^k: 之前以为是最大数*x^k ,但是错的 想想:

CodeForces #Round 320 (div 1) 简要记录

A 题意: 目前平面上有一条折线,其通过的点分别为(0,0)->(x,x)->(2x,0)->(3x,x)-.. x等于1的时候大概就是这样子 然后给定一个整数点(a,b) 询问最小的x值使折线经过这个点. 解析: 好吧其实我一直以为这是一个结论题,然后一直想有没有什么神奇的结论,结果被数学公式D的飞起. 首先a a==b直接输出a即可. a>b的时候, 有两种可能,第一种是y=x-(a-b) 另一种是y=-x+(a+b) 我们先感受一个情况,所有由斜率为1的直线经过的点都可以用斜

Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] A A Problem about Polyline

题目中给出的函数具有周期性,总可以移动到第一个周期内,当然,a<b则无解. 假设移动后在上升的那段,则有a-2*x*n=b,注意限制条件x≥b,n是整数,则n≤(a-b)/(2*b).满足条件的x≥(a-b)/(2*n) 假设在下降的那段,2*x-(a-2*x*n)=b,n+1≤(a+b)/(2*b),x≥(a+b)/(2*(n+1)) 两者取最小值 #include<bits/stdc++.h> using namespace std; int main() { int a,b; sc

Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] C A Weakness and Poorness

f(x)是个凹函数,三分即可,计算方案的时候dp一下.挂精度很坑,指定循环次数正解? #include<bits/stdc++.h> using namespace std; const double eps = 1e-11; const int maxn = 2e5+5; double a[maxn]; double d1[maxn],d2[maxn]; int n; inline double cal(double x) { double a1 = 0., a2 = 0.; for(int

Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] B. Finding Team Member 排序

B. Finding Team Member time limit per test 2 seconds memory limit per test 256 megabytes There is a programing contest named SnakeUp, 2n people want to compete for it. In order to attend this contest, people need to form teams of exactly two people.

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

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