今日头条2017后端工程师实习生笔试题
Posted njczy2010
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了今日头条2017后端工程师实习生笔试题相关的知识,希望对你有一定的参考价值。
第二题:
[编程题] 木棒拼图
有一个由很多木棒构成的集合,每个木棒有对应的长度,请问能否用集合中的这些木棒以某个顺序首尾相连构成一个面积大于 0 的简单多边形且所有木棒都要用上,简单多边形即不会自交的多边形。
初始集合是空的,有两种操作,要么给集合添加一个长度为 L 的木棒,要么删去集合中已经有的某个木棒。每次操作结束后你都需要告知是否能用集合中的这些木棒构成一个简单多边形。
输入描述:
每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n 表示操作的数量(1 ≤ n ≤ 50000) , 接下来有n行,每行第一个整数为操作类型 i (i ∈ {1,2}),第二个整数为一个长度 L(1 ≤ L ≤ 1,000,000,000)。如果 i=1 代表在集合内插入一个长度为 L 的木棒,如果 i=2 代表删去在集合内的一根长度为 L 的木棒。输入数据保证删除时集合中必定存在长度为 L 的木棒,且任意操作后集合都是非空的。
输出描述:
对于每一次操作结束有一次输出,如果集合内的木棒可以构成简单多边形,输出 "Yes" ,否则输出 "No"。
输入例子:
5 1 1 1 1 1 1 2 1 1 2
输出例子:
No No Yes No No
注意:
multiset<ll>s;
用multiset删除某个数要用:
s.erase(s.find(y));
用
s.erase(y);
会把相同的数一起删除
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<algorithm> 5 #include<set> 6 7 using namespace std; 8 9 #define N 50005 10 #define ll long long 11 12 ll sum; 13 ll ma; 14 int n; 15 int sz; 16 17 int main(){ 18 while(scanf("%d",&n) != EOF){ 19 ma = 0; 20 sum = 0; 21 multiset<ll>s; 22 multiset<ll>::iterator it; 23 int i; 24 int x; 25 ll y; 26 for(i = 0;i < n;i++){ 27 scanf("%d%lld",&x,&y); 28 if(x == 1){ 29 s.insert(y); 30 sum += y; 31 } 32 else{ 33 s.erase(s.find(y)); 34 sum -= y; 35 } 36 it = s.end(); 37 it --; 38 ma = *it; 39 sz = s.size(); 40 if(sz >= 3 && (sum - ma) > ma ){ 41 printf("Yes\n"); 42 } 43 else{ 44 printf("No\n"); 45 } 46 } 47 } 48 49 }
以上是关于今日头条2017后端工程师实习生笔试题的主要内容,如果未能解决你的问题,请参考以下文章