交互
交互题是通过程序与交互库进行交互,来解决问题的题型,大体上分为3类:
1、假的交互,把从文件读入数据变成从交互库读入
2、IO交互,
3、看不到输入数据,只能通过有限次调用交互库的函数,来找到数据的性质并解决问题(有点像猜谜
linux环境下交互题编译
采用双编译:g++ -o prog.exe prog.cpp grader.cpp -O2 -std=c++14
P3777 [APIO2017] 考拉的游戏
子任务往往可以启示正解,这题的正解就是一点点推出来的
子任务1
啥都不放,Koara也要每个位置各放一个才能取完
易知在一个位置放一个蓝色石子,Koara就会把min值的石子移过来
子任务2
看数据大概猜到是二分,其实思想差不多(貌似构造,二分和分治思想在交互题挺常见的)
第一次每个位置放一个球,筛出\([51,100]\)的位置,第二次在\([51,100]\)放各2个球,以此类推
看似是\(O(\log n)\),但收敛得很快,实际只有\(4\)次
子任务3
套用上一题可得\(11\)分
其实也是二分,由于只要决策\(0,1\),找到一种方式把\(0,1\)分离即可
一定存在策略\([x,x,0,...,0,0]\),使得\(0,1\)决策不一样,二分即可,注意二分上界是\(14\),因为Koara是牺牲别的位置的球来获取这里的权值,而\(\sum_{i=1}^{14}i>100\),使得牺牲一定不值,Koara不会选取其中任意一个
子任务4
相对上面的更简单,看数据支持\(O(n\log n)\),可以直接排序,只要搞出偏序关系就可以了
看到\(W=200\),想到每个各放\(100\)个就行了
注意这里不要用快排sort,用stable_sort(快排在小数据下会变成暴力)
子任务5
看数据范围,要求线性时间合并
看看之前我们用的全部算法,考虑子任务2的分离区间,对于权值\([l,r]\),需要一个权值\(w\),使得按照子任务2的石头分配方法,可以将值域分成\([l,k],[k+1,r]\)两部分
那么怎么找这样一个权值呢?因为值域已定,直接对序列\(\{a_i=i\}\)求是等价的,我们考虑重写(复制)一个playRound,求出每个权值下的方案,时间复杂度\(O(n^4)\)
最后调用真正的playRound即可,总共调用\(99\)次
总结
非常经典的交互题,常见的交互思路都在里面了
对于不好下手的交互,都常用特殊的方式找到一些规律(如单个,全部,连续,相邻等)
p.s. 自己做只想到了子任务1……没脸见人了
                    
                
                
            
        
浙公网安备 33010602011771号