• 题解 P6282 【[USACO20OPEN]Cereal S】


    Farmer John 的奶牛们的早餐最爱当然是麦片了!事实上,奶牛们的胃口是如此之大,每头奶牛一顿饭可以吃掉整整一箱麦片。

    最近农场收到了一份快递,内有 (M) 种不同种类的麦片((1le Mle 10^5))。不幸的是,每种麦片只有一箱!(N) 头奶牛((1le Nle 10^5))中的每头都有她最爱的麦片和第二喜爱的麦片。给定一些可选的麦片,奶牛会执行如下的过程:

    • 如果她最爱的麦片还在,取走并离开。
    • 否则,如果她第二喜爱的麦片还在,取走并离开。
    • 否则,她会失望地哞叫一声然后不带走一片麦片地离开。

    奶牛们排队领取麦片。对于每一个 (0le ile N−1),求如果 Farmer John 从队伍中移除前 (i) 头奶牛,有多少奶牛会取走一箱麦片。

    题面

    这道题我是用队列做的。我们想一想少掉 (1) 头奶牛,整个奶牛队列会发生什么变化

    首先,最前面的那头奶牛走了,就空出来了他最喜欢吃的那包麦片了。

    这包麦片可能会造成如下反应:

    • 一头奶牛原来吃的是它第 (2) 喜欢的麦片,现在它吃自己第 (1) 喜欢的了,使得又空出了一包麦片。
    • 一头奶牛原来没有东西吃,现在它吃到了它 第1/第2 喜欢的麦片。

    我们可以写一个队列来计算这个东西,由于队列是先进先出,正好符合排队的顺序。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    template<typename T>inline void read(T &FF){
    	T RR=1;FF=0;char CH=getchar();
    	for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
    	for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
    	FF*=RR;
    }
    const int MAXN=1e5+10;
    int n,m,f[MAXN],s[MAXN],k[MAXN],sum[MAXN],x[MAXN],ans;
    queue<int>v[MAXN];
    int main(){
    	read(n);read(m);
    	for(int i=1;i<=n;i++)read(f[i]),read(s[i]);
    	for(int i=1;i<=n;i++){//x的值为1,表示吃它第1喜欢的麦片;x的值为2,表示它第2喜欢的麦片;x的值为3,表示他没吃到麦片
    		if(!k[f[i]])k[f[i]]=1,x[i]=1,ans++;
    		else if(!k[s[i]])v[f[i]].push(i),k[s[i]]=1,x[i]=2,ans++;
    			else v[f[i]].push(i),v[s[i]].push(i),x[i]=3;
    	}//暴力求出所有奶牛的情况
    	cout<<ans<<endl;
    	for(int i=1;i<n;i++){
    		int xx=f[i];//离开的那头奶牛最喜欢吃的麦片
    		ans--;
    		while(v[xx].size()){
    			int q=v[xx].front();
    			v[xx].pop();
    			if(x[q]==2){
    				xx=s[q];
    				x[q]=1;
    			}
    			if(x[q]==3){
    				ans++;
    				if(f[q]==xx)x[q]=1;
    				else x[q]=2;
    				break;
    			}
    		}
    		cout<<ans<<endl;
    	}
    	return 0;
    }
    

    复杂度分析:这个代码的复杂度其实是 (O(n)) 的,因为我们最多队列里的每个元素访问 (1) 次,然后队列里元素个数是 (2n) 的。

  • 相关阅读:
    Netty 零拷贝(一)Linux 零拷贝
    启动服务(上)服务端:NioServerSocketChannel 是什么时候激活的
    Reactor 模型(一)基本并发编程模型
    并发编程(三)Promise, Future 和 Callback
    并发编程(二)concurrent 工具类
    并发编程(一)同步类容器和并发类容器
    Executor(二)ThreadPoolExecutor、ScheduledThreadPoolExecutor 及 Executors 工厂类
    Executor(一)ExecutorService 线程池
    Java NIO系列教程(一四) Files
    Java NIO系列教程(一三) Path
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/13829928.html
Copyright © 2020-2023  润新知