HNU 13308 Help cupid

Help cupid

Problem‘s Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13308&courseid=0



Mean:

地球被划分为24个时区(-11~23),现在给出n个人的时区,将这n个人两两配对,使得n/2对配偶的时区差值之和最小。

analyse:

由于给的都是整数,而且只有24个时区,首先统计每个时区有多少人。

然后每个时区的人数都%2,因为同一时区的两个人差值为0。

接着就是枚举人数不为零的时区的人数。

根据贪心的思想,我们知道除了第一个和最后一个外,其他人都是和相邻两个的其中一个匹配,为什么呢?自己画个圈去证明。

对于第一个和最后一个,要么最后特判一下,要么直接在数组后面接一个每个元素+24的数组(处理环常用方法),暴力一下就行。

Time complexity: O(N)

Source code: 

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-07-26-08.27
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define  LL __int64
#define  ULL unsigned long long
using namespace std;
int a[50],ti[50];
int main()
{
     ios_base::sync_with_stdio(false);
     cin.tie(0);
     int n,tmp;
     while(cin>>n)
     {
           memset(a,0,sizeof a);
           for(int i=0;i<n;++i)
           {
                 cin>>tmp;
                 a[tmp+11]++;
           }
           for(int i=0;i<50;++i) a[i]&=1;
           int cnt=0;
           for(int i=0;i<50;++i)
           {
                 if(a[i]) ti[cnt++]=i;
           }
           int c=cnt;
           for(int i=0;i<c;++i) ti[cnt++]=ti[i]+24;
           LL ans=LLONG_MAX;
           for(int i=0;i<c;++i)
           {
                 LL sum=0;
                 for(int j=0;j<c;j+=2) sum+=ti[i+j+1]-ti[i+j];
                 ans=ans<sum?ans:sum;
           }
           if(ans==LLONG_MAX) cout<<0<<endl;
           else cout<<ans<<endl;
     }
     return 0;
}
/*

*/

时间: 2024-09-28 21:52:52

HNU 13308 Help cupid的相关文章

贪心 --- HNU 13320 Please, go first

Please, go first Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13320 Mean: n个人一起去滑雪,要坐电梯到山顶,电梯每5分钟可以送一个人上去.这n个人中有的是组好团一起滑雪的,所以要等到齐了才能开始滑. 但是他们到达电梯下的时间都不是统一的,对于单独一个人来说,他在山下等和在山上等的时间都是一样的. 但是对于n个人的集体来说,如果让他后面的人先上去,这样可能会更节省时间.

HNU 12885 Bad Signal(模拟)

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12885&courseid=274 解题报告:一共有n个发射装置,有一个接收装置,接收装置能够正确接收并把接收到的信号准确的译码出来的条件是: Ti > 6 * (B +(T1 + T2 + .... Ti-1 + Ti+1.....Tn)) 然后Ti = si / (Pi - p) si是信号强度 pi - p的意思是发射器跟接收器之间的直线距离的平方 暴

kattis Curious Cupid (莫队算法)

Curious Cupid There are K different languages in the world. Each person speaks one and only one language. There are exactly N single men and N single women. Cupid, the god of love, wants to match every single man to a single woman, and vice versa. Ev

HNU 12888 Encryption(map容器)

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12890&courseid=274 解题报告:输入一个有n个单词的句子,然后再输入这n个单词对应的意思是什么,要你翻译出这个句子最后是什么. 一个裸的map 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm>

暴力枚举 + 24点 --- hnu : Cracking the Safe

Cracking the Safe Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 46, Accepted users: 12 Problem 12886 : No special judgement Problem description Secret agent Roger is trying to crack a safe containing evil Syr

HNU 12886 Cracking the Safe(暴力枚举)

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12886&courseid=274 解题报告:输入4个数,要你判断用 + .- . * ./.四种运算能不能得到一个结果为24的式子,可以用括号. 解释一下测试的第四组样例:应该是6 / (1 - 3 / 4) 暴力枚举三种符号分别是什么,然后枚举这三种符号运算的顺序,然后枚举这四个数字的24种排列方式,时间是4^3 * 6 * 24 然后注意要用double型,

Cupid&#39;s Arrow---hdu1756(判断点与多边形的位置关系 模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1756 题意:中文题,套模板即可: /* 射线法:判断一个点是在多边形内部,边上还是在外部,时间复杂度为O(n): 射线法可以正确用于凹多边形: 射线法是使用最广泛的算法,这是由于相比较其他算法而言,它不但可以正 确使用在凹多边形上,而且不需要考虑精度误差问题.该算法思想是从点出 发向右水平做一条射线,计算该射线与多边形的边的相交点个数,当点不在 多边形边上时,如果是奇数,那么点就一定在多边形内部,否

HNU OJ10086 挤挤更健康 记忆化搜索DP

挤挤更健康 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 339, Accepted users: 216 Problem 10086 : No special judgement Problem description 用边长小于N的正方形方砖(注意,不要求所有的方砖大小相同,请看样例说明)不重叠地铺满N*N的正方形房间,最少要几块方砖. Input 第一行是一个整

三分 - HNU 13409 Flowers

Flowers Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13409&courseid=0 Mean: 有N颗种子,每颗种子初始时营养值为0.当一颗种子营养值达到th后就会开花. 有两种操作: 1.给所有的种子浇w升水: 2.给某个种子施f升肥: 对于第i颗种子,每浇1升水会增加vw点营养值,每施1升肥可以增加vf点营养值,该种种子的肥料单价为pf,当营养值达到th后开花. 浇水必须一