【问题描述】
猴子王国里有n只猴子,第i只猴子有ri种技能。
猴子a可以是猴子b的导师,当且仅当猴子a的技能严格大于猴子b的技能(ra>rb),并且a和b无性格冲突,有性格冲突的猴子在一起会打架。
给定每个猴子的技能值,以及有性格冲突的k对猴子。对于每只猴子,找出可以成为其他猴子导师的个数。
【输入形式】
第一行包含两个正整数n和k,表示猴子的数量以及有性格冲突的猴子的对数。
第二行为一个整数序列,r1、r2、...、rn,其中ri表示第i只猴子的技能数。
接下来的k行,每行为两个正整数x、y(1≤ x、y≤n,x≠ y),表示有性格冲突的一对猴子编号,输入保证(x,y)和(y,x)不会同时出现。
【输出形式】
输出n个整数,第i个整数表示第i个猴子能成为多少只猴子的导师。
【样例输入】
4 2
10 4 10 15
1 2
4 3
【样例输出】
0 0 1 2
#include<iostream>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
int a[n]; //定义a数组存储猴子技能数
for(int i=0;i<n;i++) //输入数据
{
cin>>a[i];
}
int b[k][2]; //定义b数组存储冲突猴子对的位置数据
for(int x=0;x<k;x++) //输入数据
{
for(int y=0;y<2;y++)
{
cin>>b[x][y];
}
}
int c[n]; //定义c数组存储对应位置猴子成为导师的个数
for(int q=0;q<n;q++)
{
int num=0; //每次循环num归零
for(int w=0;w<n;w++) //先进行循环算出技能数多于多少只猴子
{
if(a[q]>a[w])
{
num++;
}
}
c[q]=num; //对其赋值
}
for(int x=0;x<n;x++)
{//进行循环,若猴子为冲突猴子中的一位,令其减一
for(int y=0;y<k;y++)
{
if(((x+1)==b[y][0])&&(a[x]>a[(b[y][1]-1)]))
{
c[x]--;
}
if(((x+1)==b[y][1])&&(a[(b[y][0]-1)]<a[x]))
{
c[x]--;
}
}
if(c[x]<0) //如果数据<0,则令其=0
{
c[x]=0;
}
}
for(int s=0;s<n;s++) //输出数据
{
cout<<c[s]<<' ';
}
return 0;
}
2120

被折叠的 条评论
为什么被折叠?



