【Round #36 (Div. 2 only) C】Socks Pairs
【题目链接】:https://csacademy.com/contest/round-36/task/socks-pairs/
【题意】
给你n种颜色的袜子,每种颜色颜色的袜子有ai只;
假设你在取袜子的时候不看取出来的是什么颜色,也不看抽屉里面;
问你最少要取多少只,才能保证,里面至少有k双袜子;
【题解】
先特判无解的情况;
若∑a[i]2<k,则无解;
如果有解;
则,先每种颜色的袜子都取一只;
这是最坏的情况了;
接下来,每种颜色的袜子都连续两双的取;
比如现在你有3只袜子了,一共也只有3种颜色的袜子供选;
你所拥有的3只,每只的颜色都不同;
然后再让你取;
你肯定是某种颜色的袜子再连续取2只;
这样,2只才贡献一个新的颜色;
而不是选两个不同的颜色,那样两只就贡献两个颜色了,不是最坏情况;
这样,我们先把所有的a[i]都减去1;
然后每种袜子都两只两只地取;
(奇数的话,1留着);
如果这样取够k双袜子了,则输出(k-1)*2+n+1
这里(k-1)*2表示取(k-1)次两双两双的情况,n是一开始取的n只不同颜色的袜子;
这时再取一只,就能保证有k只袜子了;
如果这样取不够k只袜子;
因为我们已经判断过有解,则减过1之后为奇数的a[i],选完之后,就只剩一只袜子可以选了,这里的1只的个数肯定够凑满k双袜子了,只不过选一只就要增加一对了..
这也是为什么它要放在连续两只后再考虑的原因;
这种情况下答案为已选的袜子对数*2+n+k-已选的袜子对数
【Number Of WA】
3
【反思】
比赛的时候完全没想到,每种袜子都是独立的,可以分开来连续两只地选.
以为要全都一样的数量一起两只两只选.
思维僵化…
最后稀里糊涂地就水过了。。
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1e5;
int n,k;
LL a[N+100],d[N+100],tans = 0;
void sp(){
LL cnt = 0;
rep1(i,1,n) cnt = cnt + a[i]/2;
if (cnt < k){
cout << -1 << endl;
exit(0);
}
}
int main(){
//Open();
Close();
cin >> n >> k;
rep1(i,1,n)
cin >> a[i];
sp();
rep1(i,1,n) a[i]--;
LL now = 0;
rep1(i,1,n){
now += a[i]/2;
tans += a[i]/2*2;
}
if (now >= k){
cout << (k-1)*2 + n + 1 << endl;
}else{
cout << tans + k - now << endl;
}
return 0;
}
【Round #36 (Div. 2 only) C】Socks Pairs的更多相关文章
- 【Round #36 (Div. 2 only) B】Safe Spots
[题目链接]:https://csacademy.com/contest/round-36/task/safe-spots/ [题意] 给你n个数字构成的序列; 每个位置上的数都由0和1组成; 对于每 ...
- 【CS Round #36 (Div. 2 only) A】Bicycle Rental
[题目链接]:https://csacademy.com/contest/round-36/task/bicycle-rental/ [题意] 让你从n辆车中选一辆车; 每一辆车有3个属性 1.到达车 ...
- Codeforces Round #262 (Div. 2) A. Vasya and Socks【暴力/模拟/袜子在可以在合法情况下增加后用几天】
A. Vasya and Socks time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 【CS Round #37 (Div. 2 only) D】Reconstruct Graph
[Link]:https://csacademy.com/contest/round-37/task/reconstruct-graph/statement/ [Description] 给你一张图; ...
- 【CS Round #37 (Div. 2 only) B】Group Split
[Link]:https://csacademy.com/contest/round-37/task/group-split/ [Description] 让你把一个数分成两个数a.b的和; (a,b ...
- 【CS Round #37 (Div. 2 only) A】Boring Number
[Link]:https://csacademy.com/contest/round-37/task/boring-number/ [Description] 让你找离平均数最近的一个数的下标; [S ...
- 【CS Round #39 (Div. 2 only) D】Seven-segment Display
[Link]:https://csacademy.com/contest/round-39/task/seven-segment-display/ [Description] 0..9各自有一个数字, ...
- 【CS Round #39 (Div. 2 only) C】Reconstruct Sum
[Link]:https://csacademy.com/contest/round-39/task/reconstruct-sum/ [Description] 给你一个数字S; 让你找有多少对A, ...
- 【CS Round #39 (Div. 2 only) B】Circle Elimination
[Link]:https://csacademy.com/contest/round-39/task/circle-elimination/ [Description] [Solution] 把n个点 ...
随机推荐
- HttpWebRequest WebExcepton: The remote server returned an error: (407) Proxy Authentication Required.
1. Supply the credentials of the Currently Logged on User to the Proxy object similar to this: // Be ...
- ActiveMQ学习笔记(10)----ActiveMQ容错的连接
1. Failover Protocol 前面讲述的都是Client配置连接到指定的broker上,但是,如果Broker的连接失败怎么办呢?此时,Client有两个选项:要么立刻死掉,要么连接到其他 ...
- [SCOI2012]喵星球上的点名(树状数组+后缀数组)
我们把所有的名,姓,询问都拼起来构成一个新的长串,然后跑一边SA.排完序后对于每一个询问,我们可以二分求出它所对应的区间(即满足这个区间的前缀都是这个询问串).然后问题就转化为很多区间问区间出现过的不 ...
- window安装特定补丁(勒索病毒)
最近出现震惊的蠕虫病毒(勒索病毒),微软也做出相应的安全补丁来修复 MS17-010.这时有些同学不想打开电脑 的自动更新,这样会下载大量补丁,要更新完这些补丁要好几个小时,为了不影响正常工作,我们就 ...
- Docker学习总结(4)——Docker镜像与容器命令
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare metal. ...
- [terry笔记]data guard基础知识
如下介绍了data guard的基础知识,整理自网络: Data Gurad 通过冗余数据来提供数据保护,Data Gurad 通过日志同步机制保证冗余数据和主数据之前的同步,这种同步可以是实时,延时 ...
- javascript取前n天的日期两种方法
方法一: var d = new Date(); d = new Date(d.getFullYear(),d.getMonth(),d.getDate()-n); 方法二: var now = ne ...
- filezilla server配置为 passive mode
首先要配置filezilla的setting里面的Passive mode setting选项 (2)关键部分,打开win8.1下的防火墙,新建入站规则 注意,要打开80,443端口.已经passiv ...
- jeesite 简介
jeesite 简介 https://github.com/thinkgem/jeesite http://jeesite.com/
- hdu 2191 悼念512汶川大地震遇难同胞——珍惜如今,感恩生活
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...