CCF 201903-4 消息传递接口 满分代码

CCF 201903-4 消息传递接口


一开始一直忽略进程号大于等于10的情况,直接就取字符串的第二个字符进行转化。即

op[i] - '0' + 1;

这个错误没改,提交后居然还有60分。导致我一直没有找到错误。上网找了别人的代码,基本都是模拟,而且代码又长,不想看。仔细检查一遍代码后,终于发现了这个错误。代码如下。比较短就不解释了,不懂的可以问我。
qq:1368667276

#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<list>
#include<sstream>
using namespace std;
int d[10005];
int s[667];
int T,n;
struct Node{
 vector<string> op;
 bool is_over;
};

void deal_op(list<string> &v, string &str){
 stringstream ss(str);
 string s;
 v.clear(); 
 while(ss>>s){
  v.push_front(s);
 }
}
//正数表示发送,负数表示接收,0表示无操作 
bool solve(vector<list<string> > &v){
 memset(d, 0, sizeof(int)*(n+1));
 bool is_go=false;//标志是否有操作执行
 int over_num = 0;//进程结束的个数
 for(int i=0;i<n;i++){
  if(v[i].empty()) over_num++;
 }
 while(1){
  is_go = false;
  for(int i=0;i<n;i++){
   if(v[i].empty()) continue;
   if(d[i+1]==0){
    is_go = true;
    string op = v[i].back();
    int s;
    stringstream ss(op.substr(1));
    ss>>s;
    s++;
    if(s==i+1){//等于自身 
     return false;
     v[i].pop_back();
     if(v[i].empty()) over_num++;
     continue;
    } 
    if(op[0]=='R') d[i+1] = -s;
    else if(op[0]=='S') d[i+1] = s;
    else{
     printf("Error:%s\n", op.c_str());
     return false;
    }
   }
   else{
    int a = d[i+1];
    if(a<0) a = -a;
    int b = d[a];
    if(b<0) b = -b;
    
    int n1 = d[i+1];
    int n2 = d[a];
    if(n1*n2<0 && b==i+1){
     d[i+1] = 0;
     d[a] = 0;
     is_go = true;
     v[i].pop_back();
     v[a-1].pop_back();
     if(v[i].empty()) over_num++;
     if(v[a-1].empty()) over_num++;
    }
   }
  }
  if(over_num==n) return true;
  if(is_go==false) return false;
 }
}
int main(){
 cin>>T>>n;
 vector<list<string> > v(n);
 string str;
 getline(cin, str);
 for(int i=0;i<T;i++){ 
  for(int j=0;j<n;j++){
   getline(cin, str);
   deal_op(v[j], str);
  }
  if(solve(v)) s[i] = 0;
  else s[i] = 1;
 }
 for(int i=0;i<T;i++){
  cout<<s[i]<<endl;
 }
 return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值