• ギリギリ eye (优先队列)


    1、题目:

    【题目描述】
    A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远 古文明之间的丝丝联系,促使人类终止彼此间的战争,一方面面对强大的异星人势力 ,用 “文 化的力量”寻找生存之道,一方面向着银河系进行移民而寻求新天地。西历 2067 年,银河 系边境行星的中心、失去自我而狂暴化的“Bajura”症候群扩大化。眼见事态严重,星间复合 企业体为控制症状,以少女们的“战术音乐组合 walküre”与共同作战的“Valkyrie 部队”一起集 结。
    小风,作为战术音乐组合 walküre 的预备队中的一员,迎来了他的转正试炼!当试炼 开始(第 1 个单位时间)时,将会有大量的靶机同时飞起,每一架靶机都有各自的速度和 分数(可能相同),其中速度用飞离射击范围的时间来描述。然而,因为试炼用火炮比较老
    旧,每个单位时间只能射击一发,并不是所有的靶机都能被击落,所以能得到的最高分也不
    是所有靶机的分数总和。不过由于小风强!无敌!他弹无虚发,一炮一个,非常轻松的就拿 到了能得到的最高分,现在问题来了,这个最高分是多少呢?
    PS:配合 BGM:いけないボーダーライン食用此题口感更佳
    【输入格式】
    第一行一个正整数 N,N 最大不超过 1000000
    接下来 N 行,每行两个整数 T,V,第 i 行表示第 i-1 号靶将会在 T 时刻后飞出射击范 围,击落该靶机能够获得 V 的得分。保证 T 最大不超过 700000.
    【输出格式】
    输出一个正整数,保证答案在 INT 范围。
    【样例输入】
    7
    1 6
    1 7
    3 2
    3 1
    2 4
    2 5
    6 1
    【样例输出】
    15

    2、代码(测试点有三个TLE)

    /*采用闭散列的方法*/
    #include<stdio.h>
    #include<malloc.h>
    #include<algorithm>
    using namespace std;
    typedef struct hashtable *HashTable;
    typedef struct hashtable
    {
    	int size;
    	int *ht;
    	int *state;
    } Hashtable;
    struct Ti
    {
    	int value;
    	int t;
    } T[1000001];
    
    //判断这个时间段位置是否已经被占,若被占,则往前寻找可以放的时间段,
    //之后寻找的时间段只要超过原始时间就不可以了,因为此时炸弹已经飞出射击范围
    int Unoccupied(int x,int y,HashTable H)
    {
    	int i,k;
    	for(i=H->size-1; i>=0; i--)
    	{
    		k=(y+i)%H->size;
    		if(k>=y)
    		{
    			return k;
    			break;
    		}
    		if((k<y)&&H->state[k]==1)
    		{
    			return k;
    			break;
    		}
    	}
    	return H->size;
    }
    
    //找到合适位置之后就将分数值放在该时间 
    void HtInsert(int x,int y,HashTable H)
    {
    	int i;
    	i=Unoccupied(x,y,H);
    	if(i<y)//插入位置时间一定不能比原始时间大 
    	{
    		if(i<H->size)
    		{
    			H->state[i]=0;
    			H->ht[i]=x;
    		}
    	}
    }
    
    //按照分数值降序排序 
    bool cmp(Ti t1,Ti t2)
    {
    	return t1.value>t2.value;
    }
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	int i,max=0;
    	for(i=0; i<n; i++)
    	{
    		scanf("%d%d",&T[i].t,&T[i].value);
    		if(max<T[i].t)
    		{
    			max=T[i].t;
    		}
    	}
    	HashTable H=(HashTable)malloc(sizeof*H);
    	H->size=max;
    	H->ht=(int*)malloc(H->size*sizeof(int));
    	H->state=(int*)malloc(H->size*sizeof(int));
    	for(i=0; i<H->size; i++)
    	{
    		H->state[i]=1;//1表示该位置还没有被占 
    		H->ht[i]=0;
    	}
    	sort(T,T+n,cmp);
    	for(i=0; i<n; i++)
    	{
    		//将分数从大到小放入位置 
    		HtInsert(T[i].value,T[i].t,H);
    	}
    	int ans=0;
    	for(i=0; i<max; i++)
    	{
    		ans+=H->ht[i];
    	}
    	printf("%d
    ",ans);
    	return 0;
    
    }
    

    3、代码(AC)

    /*优先队列*/
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    using namespace std;
    priority_queue<int> q;
    const int N=1000005;
    struct Node
    {
    	int t,v;
    } a[N];
    bool cmp(Node a,Node b)
    {
    	if(a.t==b.t) return a.v<b.v;
    	return a.t<b.t;
    }
    int main()
    {
    	int n,i,j,x,ans,sz;
    	scanf("%d",&n);
    	sz=q.size();
    	while(sz--) q.pop();
    	for(i=1; i<=n; ++i) scanf("%d%d",&a[i].t,&a[i].v);
    	sort(a+1,a+n+1,cmp);
    	ans=0;
    	for(i=a[n].t,j=n; i>=1; --i)
    	{
    		//对于每一个时间,将能在这个时间打的push进这个时间点的队列中,队首第一个就是这个时间点该打的
    		while(j>=1&&a[j].t>=i)
    		{
    			q.push(a[j--].v);
    		}
    		if(q.empty()) continue;
    		x=q.top();
    		q.pop();
    		ans+=x;
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
  • 相关阅读:
    CF600E Lomsat gelral 题解
    特征工程高级特征开发
    mysql 实现 TOP n
    python调用百度的情感分析API过程
    使用python建立ARIMA模型
    PYTHON 提取HTML文本
    推荐算法架构
    python json 格式化 打印
    教你用PyTorch部署模型的方法
    python 精准 四舍五入方法
  • 原文地址:https://www.cnblogs.com/laixiaolian/p/6083612.html
Copyright © 2020-2023  润新知