• CCF CSP 201903-4 消息传递接口


    思路:

    1.可以用0来存储R,用1来存储S,用一个queue<pair<int,int>>数组来存储每一个进程的指令;
    2.如果总指令数为奇数,那必定出现死锁;否则就依次遍历每一个进程,比较它需要收发信息的对象进程是否对应它的收/发(异或即可),对应上就pop这两个指令;
    3.如果循环一圈都没有pop指令那就出现了死锁;反之所有指令都pop了,那就不会出现死锁;

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef pair<int,int> P;
    #define fi first
    #define sc second
    #define mp(a,b) make_pair(a,b)
    #define rp(i,n) for(int i=0;i<n;i++)
    #define rpn(i,n) for(int i=1;i<=n;i++)
    const int MAX_N=10005;
    queue<P> pro[MAX_N];
    void clear(queue<P>& q){
    	if(!q.empty()){
    		queue<P> empty;
    		swap(empty,q);
    	}
    }
    int main(){
    	int t,n;
    	cin>>t>>n;
    	getchar();
    	while(t--){
    		int ans=0;
    		rp(i,n){
    			char c;
    			do{ 
    				c=getchar();
    				if(c=='R'||c=='S'){
    					int a=(c=='R'?0:1),b;
    					cin>>b;
    					pro[i].push(mp(a,b));
    					ans++;
    				}
    			}while(c!='
    '&&~c);
    		}
    		int pos=0,cnt=0;
    		if(ans&1){puts("1");goto here;}	
    		while(ans){	
    			P p1=pro[pos].front();
    			P p2=pro[p1.sc].front();
    			if((p1.fi^p2.fi)&&p2.sc==pos){
    				ans-=2;
    				cnt=0;
    				pro[pos].pop();
    				pro[p1.sc].pop();
    			}else{pos++;pos%=n;cnt++;}	
    			if(cnt==n){puts("1");goto here;}
    		}
    		puts("0");
    		here:;rp(i,n) clear(pro[i]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Oracle 归档模式
    如果在安装32位Oracle客户端组件的情况下64位模式运行, 将出现此问题.
    ORA-00972: 标识符过长
    Oracle SQL%ROWCOUNT
    ASP.NET Core 中间件的几种实现方式
    Python 闭包
    Python 迭代器
    Python 正则表达式提高
    Python正则表达式
    Python 生成器
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308845.html
Copyright © 2020-2023  润新知