【游戏通关】解题报告
背景背景 机房里的人都十分认真地在编程,但总有一些人会偷偷玩游戏。。。。。。 问题描述问题描述
问题描述问题描述 XY 经常在机房里偷偷玩游戏,于是他也经常被CJH 教练批评。但屡次的批评一点作用也
没有,你看他又开始玩起了游戏。 这次XY 可碰上难题了,因为据可靠的线报CJH 教练在不久后就回来机房,但XY 需要完
成N 个任务才能将这个游戏通关。 每个任务完成时限T,就是这个任务必须在时间T 之前完成(你可以认为游戏刚开始的时
间为1),还有完成这个任务XY 可以获得一定的奖励W。由于XY 娴熟的技术以及任务的简
单,他可以在一个单位时间将任务完成。 XY 想要在CJH 教练到来之前将任务全部完成,同时他也想获得最多的奖励。这个他本来
可以编程自己完成的,但是为了能马上将游戏通关,他需要全神贯注进去。于是他没有空编
程计算,于是他希望你能帮助他将问题的答案计算出来。 输入格式输入格式
输入格式输入格式 输入数据第一行有一个整数N ,表示需要完成的任务数目; 接下来N 行,每行两个整数T,W (中间用一个空格隔开),分别表示完成这个任务的最 后期限和完成这个任务后获得的奖励。 输出格式输出格式
输出格式输出格式 输出数据有且仅有一行,只包含一个整数S,表示最多获得的奖励。 样例输入输出样例输入输出
样例输入输出样例输入输出 Sample #1
game.in game.out
2 5
1 5
1 4 Sample #2
game.in game.out
5 15
2 3
1 2
4 5
1 3
3 4 样例解释样例解释
样例解释样例解释 对于样例2 XY 可以选择完成任务1,3,4 和5,这样他可以获得奖励15。 数据规模数据规模
数据规模数据规模 对于10%的数据,N≤100,Ti≤100,Wi≤2000;
对于30%的数据,N≤1000,Ti≤5000,Wi≤2000;
对于50%的数据,N≤10000,Ti≤20000,Wi≤2000;
对于100%的数据,N≤200000,Ti≤200000,Wi≤2000 。 时间限制时间限制
时间限制时间限制
1s
这道题一看感觉是一道简单题,就随便想了一个贪心策略来解,结果悲剧地WA0。这是个血的教训啊。听上去讲解的同学,他们的贪心策略都是证明过的。
program seat;
constf1=2;f2=3;
varex,jj,jz:array[1..2,1..2]of int64;n,m:longint;procedure init;
beginassign(input,'seat.in');reset(input);assign(output,'seat.out');rewrite(output);
end;function f(n:int64):int64;
vari:longint;nn:int64;p:boolean;
beginjz[1,1]:=0;jz[1,2]:=1;jz[2,1]:=1;jz[2,2]:=1;p:=true;nn:=n-2;while nn>0 do beginif nn and 1=1 then beginif not p then beginex[1,1]:=(jj[1,1]*jz[1,1]+jj[1,2]*jz[2,1])mod m;ex[1,2]:=(jj[1,1]*jz[1,2]+jj[1,2]*jz[2,2])mod m;ex[2,1]:=(jj[2,1]*jz[1,1]+jj[2,2]*jz[2,1])mod m;ex[2,2]:=(jj[2,1]*jz[1,2]+jj[2,2]*jz[2,2])mod m;jj:=ex;endelse begin jj:=jz;p:=false end;end;ex[1,1]:=(jz[1,1]*jz[1,1]+jz[1,2]*jz[2,1])mod m;ex[1,2]:=(jz[1,1]*jz[1,2]+jz[1,2]*jz[2,2])mod m;ex[2,1]:=(jz[2,1]*jz[1,1]+jz[2,2]*jz[2,1])mod m;ex[2,2]:=(jz[2,1]*jz[1,2]+jz[2,2]*jz[2,2])mod m;jz:=ex;nn:=nn shr 1;end;case n of1:begin f:=f1;exit;end;2:begin f:=f2;;exit;end;end;f:=(f1*jj[1,2]+f2*jj[2,2])mod m;
end;procedure main;
vart,i:longint;
beginreadln(t,m);for i:=1 to t do beginreadln(n);writeln(f(n));end;close(output);
end;begininit;main;
end.
汪维正+彭靖田
//用堆的贪心方法 #include <cstdio>
#include <cstdlib>
long n;
struct node
{long t;long a;
};
const long oo = 0x7fff0000;
long heap[200002];
long size = 0;
long start[200002];
node task[200002];
long ans = 0;void swap(long a,long b)
{long tmp = heap[a];heap[a] = heap[b];heap[b] = tmp;
}void adjust_down(long l)
{while((l<<=1)<size+1){if (l+1<=size&&task[heap[l+1]].a>task[heap[l]].a)l++;if (task[heap[l>>1]].a<task[heap[l]].a) swap(l>>1,l);else break;}
}void adjust_up(long l)
{while (l>1){if (task[heap[l]].a>task[heap[l>>1]].a)swap(l,l>>1);else break;l >>= 1;}
}long del()
{if (size<=0) return -1;long tmp = heap[1];heap[1] = heap[size];size--;adjust_down(1);return tmp;
}void insert(long l)
{size++;heap[size] = l;adjust_up(size);
}int bigger(const void *a,const void* b)
{long aa = *(long*)a;long bb = *(long*)b;if (aa>bb)return 1;else if (aa==bb)return 0;return -1;
}int main()
{freopen("game.in","r",stdin);freopen("game.out","w",stdout);scanf("%ld",&n);for (long i=1;i<n+1;i++){scanf("%ld%ld",&task[i].t,&task[i].a);}qsort(task+1,n,sizeof(node),&bigger);for (long i=n;i>0;i--){if (start[task[i].t]==0)start[task[i].t]=i;}long index = n;for (long i=task[index].t;i>0;i--){while (index>=0&&task[index].t==i){insert(index);index--;}long tmp = del();if (tmp>0)ans += task[tmp].a;}printf("%ld",ans);
}
刘德恩:
#include <cstdio>
#include <cstdlib>struct node
{long t;long a;
};long fa[200002];int bigger(const void* a,const void* b)
{node* aa = (node*) a;node* bb = (node*) b;if (aa->a>bb->a)return -1;if (aa->a==bb->a)return 0;return 1;
}long getroot(long a)
{if (fa[a]==a) return a;return fa[a] = getroot(fa[a]);
}void merge(long a,long b)
{fa[getroot(a)] = getroot(b);
}long n;
node task[200002];
long ans = 0;int main()
{freopen("game.in","r",stdin);freopen("game.out","w",stdout);scanf("%ld",&n);long max = 0;for (long i=1;i<n+1;i++){scanf("%ld%ld",&task[i].t,&task[i].a);max >?= task[i].t;}for (long i=0;i<max+1;i++)///一开始写成从0到n了。这是个时间的区间{fa[i] = i; }qsort(task+1,n,sizeof(node),&bigger);for (long i=1;i<n+1;i++) {long ffa = getroot(task[i].t);if (ffa!=0){ans += task[i].a;merge(ffa,ffa-1);//我觉得这句话最具有跳跃性。将父亲设为上一个点,//如果是一个空隙,则指向它,如果是一个连续区间,//则意味着于这个区间合并了并指向最左边}}printf("%ld",ans);
}
刘德恩:
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;struct ee
{int timee,w;
}a[500000];
int n,ans;
int pre[500000];void init()
{freopen("game.in","r",stdin);freopen("game.out","w",stdout);
}int cmp(const void *a,const void *b)
{struct ee *c=(ee *)a;struct ee *d=(ee *)b;if(c->w < d->w) return 1;return -1;
}void readdata()
{scanf("%d\n",&n);int i;for(i=1; i<=n; i++)scanf("%d%d\n",&a[i].timee,&a[i].w);qsort(a+1,n,sizeof(a[1]),cmp);
}int getpre(int x)
{if(x==pre[x]) return pre[x];pre[x]=getpre(pre[x]);return pre[x];
}void merge(int x,int y)
{int f,ff;f=getpre(x);ff=getpre(y);pre[f]=ff;
}void work()
{int i,t,maxx;maxx=0;for(i=1; i<=n; i++)maxx=maxx>a[i].timee ? maxx:a[i].timee;for(i=0; i<=maxx; i++) pre[i]=i;for(i=1; i<=n; i++){t=getpre(a[i].timee);if(t!=0){ans+=a[i].w;merge(t,t-1);}if(getpre(maxx)==0) return;}
}void print()
{printf("%d\n",ans);
}int main()
{init();readdata();work();print();return 0;
}
【游戏通关】解题报告相关推荐
- Cdoj 24点游戏之解题报告
24点游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1252 Descr ...
- 百度的年会游戏(解题报告)
题目来自 计蒜客 百度年会盛况空前,每个部门的年会活动也是非常有趣.某部门的年会中进行了一个有趣的游戏:一张方桌上有四边,每边可以坐一人,每人面前摆放一排长方形木块.我们一次给四边标号,分别为玩家 1 ...
- 国王游戏[NOIP2012]解题报告
在做这道题之前已经预先知道这道题是贪心了,但是贪心的思路却一直没想到,所以看了题解,发现做法还是很神奇的. Step 1 一个定理: 对于一个序列,通过交换其相邻的两个元素,一定可以变成 ...
- [LeetCode解题报告] LCP 49. 环形闯关游戏
[LeetCode解题报告] LCP 49. 环形闯关游戏 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 四. 参考链接 ...
- 格子游戏 解题报告
格子游戏 解题报告 v [问题描述] v Alice和Bob玩了一个古老的游戏:首先画一个n * n的点阵(下图n = 3) 接着,他们两个轮流在相邻的点之间画上红边和蓝边: v v v v ...
- 解题报告(八) prufer 序列与 Cayley 公式(ACM / OI)超高质量题解
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 解题报告(一)E、(BZOJ4589)Hard Nim(博弈论 + FWT)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 解题报告(一)快速沃尔什变换FWT(ACM / OI)超高质量题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- Codeforces Round #693 (Div. 3)A~G解题报告
Codeforces Round #693 (Div. 3)A~G解题报告 A Cards for Friends 原题信息 http://codeforces.com/contest/1472/pr ...
最新文章
- 在Flash中利用PCRE正则式漏洞CVE-2015-0318的方法
- Arduino作为服务器显示温度,基于Arduino 带LCD显示的电子温度计
- 基于Html5的移动端开发框架的研究
- 1148 Werewolf - Simple Version (20 分)
- windows 访问linux中的mongodb,MongoDB的linux系统下的安装与连接
- 測试AtomicInteger与普通int值在多线程下的递增操作
- 有做行业站的转行做企业站的吗?
- C# 简单日志文本输出
- POJ3414 Pots —— BFS + 模拟
- 华为招聘产业联盟高级专家、 开发者生态专家
- WIN10的永久杜比音效的安装(2021)
- 隐藏input的三种方法
- win10系统怎样安装/更新独立显卡驱动
- BOF算法 基于SIFT+KMeans
- linux mplayer rpm,mplayer - movie player for linux
- 2019牛客暑期多校训练营(第九场)A——The power of Fibonacci(循环节+中国剩余定理(互质)||广义BM)
- 研究生语音识别课程作业记录(三) 非特定人孤立词识别
- 学术会议 Rebuttal 模板资料留存
- 应用概率统计-第一章 随机事件及其概率
- 算法-蓝桥杯习题(3-1)