题目链接:点我
题目大意:给你n个人,然后给你一个非递减序列a1 a2 an 分别表示每个人击杀人数,要求满足游戏规则输出YES并且输出每个人击杀的玩家序号,否则输出No.
代码能力太弱,想了半天不知道怎么写。后来参考一下大佬的代码,非常巧妙。
代码参考:@SmoothLatte
AC代码:
/*
2017年8月14日11:32:44
模拟
M
AC
*/
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int maxn=2e5+10;
int kill[maxn];
int killer[maxn],bekill[maxn];
int main(){
int n;
long long sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&kill[i]);//记录每个人击杀人数
sum+=kill[i];
}
if(sum>=n) printf("NO\n");//如果击杀人数大于等于n,不成立
else{
int cur=n,id=0;
//从 最后一个人开始扫描
//如果其击杀人数大于1,那么记录其ID以及被击杀人的ID,同事id 和 cur 更新
for(int i=n;i>=1;i--){
for(int j=0;j<kill[i];j++){
killer[id]=i;
bekill[id++]=cur--;
}
}
printf("YES\n");
//如果全部存活,那么只输出yes即可
for(int i=0;i<id;i++){
printf("%d %d\n",killer[i],bekill[i]);
}
}
return 0;
}