比较简单的,注意的问题是一个输入库可能话费多个货物进行转化,需要对输入进行特殊处理
Problem | Verdict | Lang | Time | Best | Rank | Submit Time |
---|---|---|---|---|---|---|
| discuss804 - | Accepted | C++ | 0.099 | 0.028 | 14 | 2 mins ago |
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 105;
int np,nt;
struct Node{
int id;
int num;
Node(int id = 0,int num = 0):id(id),num(num){};
};
vector<Node>in[maxn];
vector<Node>out[maxn];
int np_num[maxn],arr[100005];
bool solve(){
for(int i = 1; i <= nt; i++){
int ok = 1;
for(int j = 0; j < in[i].size(); j++){
int id = in[i][j].id,num = in[i][j].num;
if(np_num[id] < num){
ok = 0;
break;
}
}
if(ok){
for(int j = 0; j < in[i].size(); j++){
int id = in[i][j].id,num = in[i][j].num;
np_num[id] -= num;
}
for(int j = 0; j < out[i].size(); j++){
int id = out[i][j].id,num = out[i][j].num;
np_num[id] += num;
}
return true;
}
}
return false;
}
int main(){
int Case = 1;
//freopen("in.txt","r",stdin);
while(scanf("%d",&np) && np){
for(int i = 1; i <= np; i++)
scanf("%d",&np_num[i]);
scanf("%d",&nt);
for(int i = 1; i <= nt; i++){
int cnt = 0;
in[i].clear(); out[i].clear();
while(scanf("%d",&arr[cnt]) && arr[cnt])
cnt ++;
sort(arr,arr + cnt);
if(cnt == 0) continue;
int id = arr[0],num = 1;
for(int j = 1; j < cnt; j++){
if(arr[j] != arr[j - 1]){
if(id < 0)
in[i].push_back(Node(-id,num));
if(id > 0)
out[i].push_back(Node(id,num));
id = arr[j];
num = 1;
}
else num++;
}
if(id < 0)
in[i].push_back(Node(-id,num));
if(id > 0)
out[i].push_back(Node(id,num));
}
int cir,i;
scanf("%d",&cir);
for(i = 1; i <= cir; i++){
if(!solve())
break;
}
if(i > cir)
printf("Case %d: still live after %d transitions\n",Case++,i - 1);
else
printf("Case %d: dead after %d transitions\n",Case++,i - 1);
printf("Places with tokens:");
for(int i = 1; i <= np; i++){
if(np_num[i])
printf(" %d (%d)",i,np_num[i]);
}
puts("\n");
}
return 0;
}