2019/7/18ACM集训
2019-07-18
09:15:34
这个是练习刷的题
Vus the Cossack and Numbers
Vus the Cossack has nn real numbers aiai. It is known that the sum of all numbers is equal to 00. He wants to choose a sequence bb the size of which is nn such that the sum of all numbers is 00 and each bibi is either ⌊ai⌋⌊ai⌋ or ⌈ai⌉⌈ai⌉. In other words, bibi equals aiairounded up or down. It is not necessary to round to the nearest integer.
For example, if a=[4.58413,1.22491,−2.10517,−3.70387]a=[4.58413,1.22491,−2.10517,−3.70387], then bb can be equal, for example, to [4,2,−2,−4][4,2,−2,−4].
Note that if aiai is an integer, then there is no difference between ⌊ai⌋⌊ai⌋ and ⌈ai⌉⌈ai⌉, bibiwill always be equal to aiai.
Help Vus the Cossack find such sequence!
The first line contains one integer nn (1≤n≤1051≤n≤105) — the number of numbers.
Each of the next nn lines contains one real number aiai (|ai|<105|ai|<105). It is guaranteed that each aiai has exactly 55 digits after the decimal point. It is guaranteed that the sum of all the numbers is equal to 00.
In each of the next nn lines, print one integer bibi. For each ii, |ai−bi|<1|ai−bi|<1 must be met.
If there are multiple answers, print any.
4
4.58413
1.22491
-2.10517
-3.70387
4
2
-2
-4
5
-6.32509
3.30066
-0.93878
2.00000
1.96321
-6
3
-1
2
2
The first example is explained in the legend.
In the second example, we can round the first and fifth numbers up, and the second and third numbers down. We can round the fourth number neither up, nor down.
题解:
这道题把所有的值向下取整,求两数的差的总和,如果sum > 0 ,就说明向下取整导致值变小,所以要加,sum < 0,类似
错误点:
我没有注意两数之差要小于1
#include <bits/stdc++.h>
using namespace std; typedef long long ll; double a[] = {};
ll b[] = {};
double sum = ; int main()
{
ll n;
scanf("%lld",&n); for(ll i = ; i < n; i++)
{
scanf("%lf", &a[i]);
b[i] = floor( a[i] );
sum += (a[i] - b[i]);
}
sum = round(sum);
if(sum > ) //b[i]相较于a[i]减去的太多了,所以b[i]++
{
for(ll i = ; i < n; i++)
{
if(sum == )
{
break;
}
b[i]++;
sum--;
if(abs(a[i] - b[i]) >= )
{
b[i]--;
sum++;
} }
}
else
{
for(ll i = ; i < n; i++)
{
if(sum == )
{
break;
}
b[i]--;
sum++;
if(abs(a[i] - b[i]) >= )
{
b[i]++;
sum--;
} }
}
for(ll i = ; i < n; i++)
{
cout << b[i] << endl;
} return ;
}
题2:
Your favorite shop sells nn Kinder Surprise chocolate eggs. You know that exactly ssstickers and exactly tt toys are placed in nn eggs in total.
Each Kinder Surprise can be one of three types:
- it can contain a single sticker and no toy;
- it can contain a single toy and no sticker;
- it can contain both a single sticker and a single toy.
But you don't know which type a particular Kinder Surprise has. All eggs look identical and indistinguishable from each other.
What is the minimum number of Kinder Surprise Eggs you have to buy to be sure that, whichever types they are, you'll obtain at least one sticker and at least one toy?
Note that you do not open the eggs in the purchasing process, that is, you just buy some number of eggs. It's guaranteed that the answer always exists.
The first line contains the single integer TT (1≤T≤1001≤T≤100) — the number of queries.
Next TT lines contain three integers nn, ss and tt each (1≤n≤1091≤n≤109, 1≤s,t≤n1≤s,t≤n, s+t≥ns+t≥n) — the number of eggs, stickers and toys.
All queries are independent.
Print TT integers (one number per query) — the minimum number of Kinder Surprise Eggs you have to buy to be sure that, whichever types they are, you'll obtain at least one sticker and one toy
3
10 5 7
10 10 10
2 1 1
6
1
2
In the first query, we have to take at least 66 eggs because there are 55 eggs with only toy inside and, in the worst case, we'll buy all of them.
In the second query, all eggs have both a sticker and a toy inside, that's why it's enough to buy only one egg.
In the third query, we have to buy both eggs: one with a sticker and one with a toy.
题解:
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
int main()
{
ll T;
scanf("%lld", &T);
while(T--)
{
ll n, s, t;
scanf("%lld %lld %lld", &n, &s, &t);
ll x = s + t - n;
cout << max(s, t) - x + << endl;
} return ;
}
题3:
After playing Neo in the legendary "Matrix" trilogy, Keanu Reeves started doubting himself: maybe we really live in virtual reality? To find if this is true, he needs to solve the following problem.
Let's call a string consisting of only zeroes and ones good if it contains differentnumbers of zeroes and ones. For example, 1, 101, 0000 are good, while 01, 1001, and 111000 are not good.
We are given a string ss of length nn consisting of only zeroes and ones. We need to cut ss into minimal possible number of substrings s1,s2,…,sks1,s2,…,sk such that all of them are good. More formally, we have to find minimal by number of strings sequence of good strings s1,s2,…,sks1,s2,…,sk such that their concatenation (joining) equals ss, i.e. s1+s2+⋯+sk=ss1+s2+⋯+sk=s.
For example, cuttings 110010 into 110 and 010 or into 11 and 0010 are valid, as 110, 010, 11, 0010 are all good, and we can't cut 110010 to the smaller number of substrings as 110010 isn't good itself. At the same time, cutting of 110010 into 1100 and 10 isn't valid as both strings aren't good. Also, cutting of 110010 into 1, 1, 0010 isn't valid, as it isn't minimal, even though all 33 strings are good.
Can you help Keanu? We can show that the solution always exists. If there are multiple optimal answers, print any.
The first line of the input contains a single integer nn (1≤n≤1001≤n≤100) — the length of the string ss.
The second line contains the string ss of length nn consisting only from zeros and ones.
Output
In the first line, output a single integer kk (1≤k1≤k) — a minimal number of strings you have cut ss into.
In the second line, output kk strings s1,s2,…,sks1,s2,…,sk separated with spaces. The length of each string has to be positive. Their concatenation has to be equal to ss and all of them have to be good.
If there are multiple answers, print any.
Examples
1
1
1
1
2
10
2
1 0
6
100011
2
100 011
Note
In the first example, the string 1 wasn't cut at all. As it is good, the condition is satisfied.
In the second example, 1 and 0 both are good. As 10 isn't good, the answer is indeed minimal.
In the third example, 100 and 011 both are good. As 100011 isn't good, the answer is indeed minimal.
题解:
第一:
如果个数是偶数,除2,还要在判断一下奇偶
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
int main()
{
ll n;
scanf("%lld", &n);
getchar();
string s;
cin >> s;
ll zer = ;
ll one = ;
for(ll i = ; i < s.length(); i++)
{
if(s[i] == '')
{
zer++;
}
else
{
one++;
} }
if(zer != one)
{
cout << << endl;
cout << s;
}
else
{
if( (n/) & )
{
cout << << endl;
ll lenth = s.length();
for(ll i = ; i < lenth / ; i++)
{
cout << s[i];
}
cout << " ";
for(ll i = lenth/; i < n; i++)
{
cout << s[i];
}
}
else
{
cout << << endl;
ll lenth = s.length();
for(ll i = ; i <= lenth / ; i++)
{
cout << s[i];
}
cout << " ";
for(ll i = lenth/ + ; i < n; i++)
{
cout << s[i];
}
} } return ;
}
#include <bits/stdc++.h>usingnamespacestd; typedeflonglong ll; double a[100005] = {0}; ll b[100005] = {0}; double sum = 0; int main() { ll n; scanf("%lld",&n); for(ll i = 0; i < n; i++) { scanf("%lf", &a[i]); b[i] = floor( a[i] ); sum += (a[i] - b[i]); } sum = round(sum); if(sum > 0) //b[i]相较于a[i]减去的太多了,所以b[i]++ { for(ll i = 0; i < n; i++) { if(sum == 0) { break; } b[i]++; sum--; if(abs(a[i] - b[i]) >= 1) { b[i]--; sum++; } } } else { for(ll i = 0; i < n; i++) { if(sum == 0) { break; } b[i]--; sum++; if(abs(a[i] - b[i]) >= 1) { b[i]++; sum--; } } } for(ll i = 0; i < n; i++) { cout << b[i] << endl; } return0; }
2019/7/18ACM集训的更多相关文章
- 2019暑期金华集训 Day7 分治
自闭集训 Day7 分治 主定理 由于我沉迷调题,这个地方没听课. 某些不等式 咕了 nth_element 使用快速排序的思想,选一个中间点,看左右有多少个. 期望复杂度\(O(n)\). 首先把一 ...
- 2019暑期金华集训 Day7 动态规划
自闭集训 Day7 动态规划 LOJ6395 首先发现这个树的形态没啥用,只需要保证度数之和是\(2n-2\)且度数大于0即可. 然后设\(dp_{i,j}\)表示前\(i\)个点用了\(j\)个度数 ...
- 2019暑期金华集训 Day6 杂题选讲
自闭集训 Day6 杂题选讲 CF round 469 E 发现一个数不可能取两次,因为1,1不如1,2. 发现不可能选一个数的正负,因为1,-1不如1,-2. hihoCoder挑战赛29 D 设\ ...
- 2019暑期金华集训 Day6 计算几何
自闭集训 Day6 计算几何 内积 内积不等式: \[ (A,B)^2\le (A,A)(B,B) \] 其中\((A,B)\)表示\(A\cdot B\). (好像是废话?) 叉积 \[ A\tim ...
- 2019暑期金华集训 Day5 树上数据结构
自闭集训 Day5 树上数据结构 前置知识 点分治 边分治 树链剖分 LCT Top Tree LCT时间复杂度 线段树每次查询是严格\(\log n\)的,然而splay维护连续段的时候,如果每次查 ...
- 2019暑期金华集训 Day5 生成函数
自闭集训 Day5 生成函数 一般生成函数 无脑地把序列变成多项式: \[ \{a_i\}\rightarrow A(x)=\sum_{n} a_nx^n \] 形式幂级数 生成函数是一种形式幂级数. ...
- 2019暑期金华集训 Day3 字符串
自闭集训 Day3 字符串 SAM 考虑后缀树. SAM的parent树是反串的后缀树,所以后面加一个字符的时候相当于往串前面加一个字符,恰好多出了一个后缀. 于是可以以此来理解SAM. 每一条路径对 ...
- 2019暑期金华集训 Day3 图论
自闭集训 Day3 图论 NOI2019 D2T1 没有真正建出图来的必要,可以直接打取\(\min\)的\(tag\). 也可以把边压进堆里,然后变成一个二维清点问题(???),然后就线段树+并查集 ...
- 2019暑期金华集训 Day2 线性代数
自闭集训 Day2 线性代数 高斯消元 做实数时,需要找绝对值最大的作为主元,以获取更高精度. 在欧几里得环(简单例子是模合数)意义下也是对的.比如模合数意义下可以使用辗转相除法消元. 欧几里得环:对 ...
随机推荐
- delphi开第二个进程报错cannot create file editorlineends.ttr
网上说问题是windows系统补丁造成的,解决办法有卸补丁.装插件,还有自己搞个bat启动. 在网上看到最好的一个办法是: 把这个文件EditorLineEnds.ttr的后缀改为ttf,然后安装这个 ...
- 【18NOIP普及组】对称二叉树(信息学奥赛一本通 1981)(洛谷 5018)
[题目描述] 一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树: 1.二叉树: 2.将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等. 下图中节点内的数字为权值,节点外 ...
- 「ZJOI2019」麻将
传送门 Solution 对于条件一:记录一个\(cnt\)表示牌个数\(≥2\)的个数 设\(dp_{i,0/1,j,k}\)表示考虑了\(1...i\),当前是否有对子,以\(i-1\),\(i ...
- SpringMVC自定义类型转换器
SpringMVC 自定义类型转换器 我们在使用SpringMVC时,常常需要把表单中的参数映射到我们对象的属性中,我们可以在默认的spring-servlet.xml加上如下的配置即可做到普通数据 ...
- git之fatal: Could not read from remote repository
问题背景:在git bash中使用hexo g -d命令进行文章发布 详细错误信息: fatal: Could not read from remote repository. Please make ...
- 剑指offer:整数中1出现的次数
题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了 ...
- HearthBuddy投降插件2019-11-01的使用
在AutoConcede.cs文件中找到如下代码 private List<int> _winList = new List<int> {0, 2, 4, 6, 8}; 现在的 ...
- Java多个线程顺序打印数字
要求 启动N个线程, 这N个线程要不间断按顺序打印数字1-N. 将问题简化为3个线程无限循环打印1到3 方法一: 使用synchronized 三个线程无序竞争同步锁, 如果遇上的是自己的数字, 就打 ...
- leetcode 266.Palindrome Permutation 、267.Palindrome Permutation II
266.Palindrome Permutation https://www.cnblogs.com/grandyang/p/5223238.html 判断一个字符串的全排列能否形成一个回文串. 能组 ...
- linux环境中,openssl升级及openresty中nginx基于新版本openssl重新编译
需求说明: 最近在对系统进行安全扫描的时候,出现了openssl版本的问题,建议对openssl版本进行升级,在此记录下升级过程. 环境说明: 操作系统:RHEL 6.6 升级操作过程: 1.下载最新 ...