三层架构,反射工厂(超强合成山寨版!)
2010-11-19 17:44
176 查看
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1306
解题思路:唬人的水题,只要按照他的意思打,就能过,不过,数组最好开大点。用到优先队列,也可以用栈来处理。
总元素就只有N个,再怎么挪,总个数也不会变化。处理的时候B中的值虽说要加b,但是,不管加成什么样子,最后要放到A里面去的时候还是要变成0,完全不用管它的值有多大。A里面的元素,有要进来的(都是0),有要出去的(大于K),还要每次加a。
所以,我们可以只处理A中得元素,【B中元素的个数】=n-【A中元素个数】。每次处理的时候,要是B中还有元素n-【A中元素个数】>0,就从B中取个元素处理后放到A中(其实就是往A中放个0,因为不管原数是多少,最后都是变成0放进去)。
对于A中得数,每次处理都要加a。要是每次处理都给A中的数全加a,耗时较多。而且,A中得数的值只在判断是否大于k是有效。所以,我们可以用优先队列存储A中的数。每次处理,就拿出队头元素,把它加上从开始处理到现在要加的值(i*a(第i次处理))再判断即可。要是队头元素加上i*a>k,则弹出即可。
对于压入队列的“0”,不要直接压“0”,要处理。压入队的,应该是“相对0”,对于现在,队中所有元素加的a的情况来说,是“0"的值,即“-a*(i-1)”。因为后面轮到它加时,要加i个a,而在它进来的前面的那些要加的a,它不该加,所以要提前“减掉”。
对于处理操作次数时,不能每输入一个数都重头操作一次。我们只要记住【最大的操作次数】,然后把数据从原始数据操作【最大的操作次数】次,其中记录每次操作前的A中的元素的个数即可。最后,只要按照输入的操作次数的顺序输出相关值即可。
本文出自 “try it” 博客,请务必保留此出处http://huahua520amy.blog.51cto.com/6729449/1373626
解题思路:唬人的水题,只要按照他的意思打,就能过,不过,数组最好开大点。用到优先队列,也可以用栈来处理。
总元素就只有N个,再怎么挪,总个数也不会变化。处理的时候B中的值虽说要加b,但是,不管加成什么样子,最后要放到A里面去的时候还是要变成0,完全不用管它的值有多大。A里面的元素,有要进来的(都是0),有要出去的(大于K),还要每次加a。
所以,我们可以只处理A中得元素,【B中元素的个数】=n-【A中元素个数】。每次处理的时候,要是B中还有元素n-【A中元素个数】>0,就从B中取个元素处理后放到A中(其实就是往A中放个0,因为不管原数是多少,最后都是变成0放进去)。
对于A中得数,每次处理都要加a。要是每次处理都给A中的数全加a,耗时较多。而且,A中得数的值只在判断是否大于k是有效。所以,我们可以用优先队列存储A中的数。每次处理,就拿出队头元素,把它加上从开始处理到现在要加的值(i*a(第i次处理))再判断即可。要是队头元素加上i*a>k,则弹出即可。
对于压入队列的“0”,不要直接压“0”,要处理。压入队的,应该是“相对0”,对于现在,队中所有元素加的a的情况来说,是“0"的值,即“-a*(i-1)”。因为后面轮到它加时,要加i个a,而在它进来的前面的那些要加的a,它不该加,所以要提前“减掉”。
对于处理操作次数时,不能每输入一个数都重头操作一次。我们只要记住【最大的操作次数】,然后把数据从原始数据操作【最大的操作次数】次,其中记录每次操作前的A中的元素的个数即可。最后,只要按照输入的操作次数的顺序输出相关值即可。
40227 | 20114045007 | 1306 | Accepted | 2056 | 288 | C++/Edit | 924 B | 2013-09-02 11:10:07 |
#include<stdio.h> #include<queue> #include<algorithm> using namespace std; int main() { int n,k,a,b; int i,j; int q,m[205]; //询问次数和询问的情况 int size[405];//A中元素的个数 int f,max1; //输入的原数,询问中处理次数最多的那个次数 while(scanf("%d%d%d%d",&n,&k,&a,&b)!=EOF) { max1=0; priority_queue<int> pq; //优先队列,存储A中数的情况 for(i=0; i<n; i++) { scanf("%d",&f); if(f<=k)pq.push(f); //要是输入的原数情况,小于等于k的放入A中 } scanf("%d",&q); for(i=0; i<q; i++) //输入询问情况 { scanf("%d",&m[i]); max1=max(max1,m[i]); //记录询问中最大操作次数 } for(i=1; i<=max1; i++) { size[i]=pq.size(); //第i次操作前A中元素个数,【B中元素个数】 = n - 【A中元素个数】 if(n-pq.size()>0)pq.push((i-1)*a*(-1));//B中没有元素的话,就不取;否则取一个"0",加到A中,由于A中所有元素后面都要加i'*a,此时已经加了i*a,所以放进去的元素值应该是(i-1)*a*(-1) while(!pq.empty()&&pq.top()+a*i>k) pq.pop(); //若A中的值加了i*a后大于K,则直接弹出(相当于放入B中)) } for(i=0; i<q; i++) printf("%d\n",n-size[m[i]]); //输出第i次操作前B中元素个数 } return 0; }
本文出自 “try it” 博客,请务必保留此出处http://huahua520amy.blog.51cto.com/6729449/1373626
相关文章推荐
- 三层架构之抽象工厂加反射——实现数据库转换
- (Reflection)认识反射(反射实例化,反射评价,在工厂三层架构应用)
- 三层架构之抽象工厂加反射----实现数据库转换
- 三层架构之抽象工厂加反射----实现数据库转换
- 三层架构实现登录(工厂+反射+配置文件)
- 三层架构之抽象工厂加反射----实现数据库转换
- 实战才是王道:工厂模式、三层架构、反射、多数据库问题
- 抽象工厂下的三层架构
- 三层架构之数据访问层,利用反射返回IList泛型集合
- 三层构架与反射工厂的笔记
- asp.net网站三层架构详解和反射知识
- JDBC简单操作(三层架构以及简单工厂的实现)
- 关于三层架构,MVC模型,工厂设计模式三者 .
- 三层之抽象工厂加反射实例
- 关于三层架构,MVC模型,工厂设计模式三者
- C#写Facotry解析.Net的反射和Attribute (数据库工厂的架构)
- asp.net mvc中自行搭建实现工厂模式的spring.net+三层架构 (15-4-20)
- 抽象工厂————三层架构
- 三层架构,MVC模型,工厂设计模式的粗浅理解 转
- 面向接口编程在Java web 三层架构的应用与使用工厂模式解决问题