题目链接:[NOIP2016]蚯蚓 (nowcoder.com)
目录
思路:
一道队列的题
该题对于我们主要的问题是如何
我们可以通过题目发现
对于每一次剪切后的蚯蚓
如果将剪切后长度为 px 和 x-px 的蚯蚓
用队列q1 和 q2 分别push的话
会发现两个队列都是从大到小排列
故每次我们只需要每次比较
剩余未被剪的蚯蚓 和 q1队首 和 q2队首
中的最大元素即可
因为每秒蚯蚓都会加长
我们可以加到某个状态的加了多少次
把它记录下来
并且记住每次取最长的蚯蚓的时候
需要把它的长度 加上 蚯蚓生长的长度
每次把被剪的两只蚯蚓放入队列的时候
需要把它的长度 减去 蚯蚓生长的长度
代码详解:
- #include
- using namespace std;
- #include
- #include
- queue<int> q1,q2;
- #define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
- int a[(int)1e5+6];
- int n, m, q, u, v, t, tmb,ti;
- int maxx(void)//找最大操作
- {
- int ans=-1e9;
- if(ti<=n) ans=a[ti];
- if(!q1.empty()) ans=max(ans,q1.front());
- if(!q2.empty()) ans=max(ans,q2.front());
- if(ti<=n&&ans==a[ti]) ti++;
- else if(!q1.empty()&&ans==q1.front()) q1.pop();
- else q2.pop();
- return ans;
- }
- int main() {
- IOS;
- cin >> n >> m >> q >> u >> v >> t;
- double p = (u * 1.0) / (v * 1.0);
- for (int i = 1; i <= n; i++) {
- cin >> a[i];
- }
- sort(a+1,a+1+n,greater<int>());//对原序列进行排序
- ti=1;
- int AddLen = 0;//记录蚯蚓生长的长度
- for (int i = 1; i <= m; i++) {
- int x = maxx()+AddLen;
- if(i%t==0) cout<
" "; - int len = p * x;
- AddLen += q;
- q1.push(len-AddLen);
- q2.push(x - len-AddLen);
- }
-
- cout << endl;
- for (int i = 1; i <= (n + m); i++) {
- int x=maxx() + AddLen ;
- if (i % t == 0) {
- cout << x<< " ";
- }
- }
- return 0;
- }
PS:题目还是有点搞心态的,细节太多了,模拟起来倒是有点麻烦,so,加油