Gym - 101341M-简单模拟-Last Man Standing

xiaoxiao2021-02-28  111

这道题应该水过的。。。不知道为什么,可能是因为被b题卡的太狠了,我们都没足够的做题经验。。哎,这道题我当天晚上就看懂了,觉得有点麻烦,其实还好啦。 给个数列,数字为标号为i+1的人杀死的人的个数。 让你输出 他们之间的杀人关系。比如 1 0 ,第一个杀了一个,第二个没杀。肯定是 1 2 1把2杀了,如果有很多中顺序,任意输出。 题目中应该是有顺序的。不然还真不好写呢。如果没有顺序的话输出输出序列就是个很麻烦的事情了。 先从到小排列(标号最小的是杀人魔耶),然后依次输出即可,注意用数字判断一下顺序,不然的话。。容易mle。。 并且,codeforce是真好,数字用int存不下也报 re。 666

#include <iostream> #include <cstdio> #include <bits/stdc++.h> using namespace std; int cmp2(int a,int b) { return a>b; } int main() { int n; cin>>n; long long all=0; int sum=0; int flag=0; int a[200009]; for(int i=0;i<n;i++) {cin>>a[i]; all+=a[i]; if(sum>a[i]) { sum=a[i]; flag=i; } } if(all>n-1) { puts("NO"); return 0; } puts("YES"); if(all==0) return 0; vector<int>q; vector<int>p; for(int i=0;i<n;i++) { if(a[i]!=0) { //for(int j=0;j<a[i];j++) q.push_back(i+1); } if(i!=flag) { //for(int j=0;j<a[i]+1;j++) p.push_back(i+1); } } sort(q.begin(),q.end(),cmp2); sort(p.begin(),p.end(),cmp2); int j=0; for(int i=0;i<q.size();i++) { for(int x=0;x<a[q[i]-1];x++) {cout<<q[i]<<" "<<p[j]<<endl; j++; } } //cout<<j<<endl; return 0; }
转载请注明原文地址: https://www.6miu.com/read-64260.html

最新回复(0)