【排序】谁会赢?

题目描述

最近,在课余时间流行一种游戏,游戏的规则如下:游戏开始时,每个人都从规定范围内的数中选取一个数(保证所选取的数各不相同),写在纸上,握在手中(以防让别的同学看见),然后同时打开,如果其中一个同学手中的数是其他任意两位同学手中的数之和,那么他就赢,如果满足条件的有多个,手中的数最大的那位同学赢。这是心理和智力的双重考验,所以参加的学生越来越多,但是,由于参与人数众多,要判断谁赢就成了问题,请聪明的你设计一个程序来解决这个问题!

 

输入

第1行为一个整数N(3≤N≤50000),表示参加游戏的总人数,第2行为N个数(范围在0~2^31之间),依次表示N个同学所选的数,第i个数表示第i位同学所选的数。

 

输出

只一行,为一个整数,表示哪位同学赢。如果没有任何一位同学赢,则输出“0”。

 

样例输入
5
2 5 7 3 13 

 

样例输出
3

 

提示

 

100%的数据:N≤50000

 根据题目的意思,我们想到把数据从小到大排序,然后从后向前对于每个数据都和它前面的数据进行比较,如果该数据与它前面的差值存在于总数据中,我们就可以结束遍历,并且答案就是这个数据所对应的人的位置

我们想到利用set中元素不重复的性质来实现遍历,但我们要注意两点:1、差值不能和被减数相等;2、被减数不能为0

 1 #include <bits/stdc++.h>
 2  
 3 using namespace std;
 4 typedef long long ll;
 5 struct node
 6 {
 7     ll v,pos;
 8 }mp[50005];
 9 bool cmp(node a,node b)
10 {
11     return a.v<b.v;
12 }
13 ll n;
14 int main()
15 {
16     ios::sync_with_stdio(false);
17     cin>>n;
18     set<ll>s;
19     for(ll i=0;i<n;i++)
20     {
21         cin>>mp[i].v;
22         mp[i].pos=i+1;
23         s.insert(mp[i].v);
24     }
25     sort(mp,mp+n,cmp);
26     bool flag=0;
27     for(ll i=n-1;i>=0;i--)
28     {
29         for(ll j=i-1;j>=0;j--)
30         {
31             if(mp[j].v==0)  continue;
32             s.insert(mp[i].v-mp[j].v);
33             ll tmp=s.size();
34             if(tmp==n&&mp[i].v!=2*mp[j].v)
35             {
36                 cout<<mp[i].pos<<endl;
37                 flag=1;
38                 return 0;
39             }
40             else
41             {
42                 s.erase(mp[i].v-mp[j].v);
43             }
44         }
45     }
46     if(!flag)
47             cout<<"0"<<endl;
48     return 0;
49 }
View Code

 

转载于:https://www.cnblogs.com/scott527407973/p/9445018.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++收集瓶盖大奖是一个编程题目,它的具体描述如下: 有一家饮料公司正在举行一项促销活动,如果你在瓶盖上找到了特定的字母组合,就可以获得一瓶免费饮料。现在,你需要编写一个程序来模拟这个活动。 具体来说,你需要实现以下两个函数: 1. `bool checkCode(string code)`:判断给定的字母组合是否是特定的字母组合。如果是,返回 true;否则,返回 false。 2. `int collectCodes(int n)`:模拟收集瓶盖的过程。假设你一共收集了 n 个瓶盖,每个瓶盖上都有一个字母组合。如果某个瓶盖上的字母组合是特定的字母组合,你就可以获得一瓶免费饮料。假设你可以无限次地获得免费饮料,那么你最多可以获得多少瓶免费饮料? 这个问题可以用哈希表来解决。具体来说,我们可以用一个 unordered_set 来存储特定的字母组合,然后在 checkCode 函数中判断给定的字母组合是否在这个 unordered_set 中出现过。在 collectCodes 函数中,我们可以遍历所有的瓶盖,对于每个瓶盖,如果它上面的字母组合是特定的字母组合,就将答案加一。 下面是一个可能的实现: ```c++ #include <unordered_set> #include <string> using namespace std; class BottleCapCollector { public: BottleCapCollector() { codes.insert("ABC"); codes.insert("DEF"); codes.insert("GHI"); } bool checkCode(string code) { return codes.count(code) > 0; } int collectCodes(int n) { int ans = 0; for (int i = 0; i < n; i++) { string code = generateCode(); if (checkCode(code)) { ans++; } } return ans; } private: unordered_set<string> codes; string generateCode() { // 生成随机的字母组合 return "ABC"; } }; ``` 这个实现中,我们用 unordered_set 存储了特定的字母组合,用 checkCode 函数来判断给定的字母组合是否在这个 unordered_set 中出现过。在 collectCodes 函数中,我们遍历了所有的瓶盖,对于每个瓶盖,如果它上面的字母组合是特定的字母组合,就将答案加一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值