T1
这道题其实就是单纯对数据进行排序,但是因为关键字不止一种(解题数m和罚时t) 并且输出的是队伍的名字(也就是序号)
而正常排序完之后我们就会发现 我们并不知道当前各个位置的数对应的队伍名是什么了(也就是其原本的位置信息已经在排序过程中丢失了)
这个时候我们发现 一个队伍有三种信息 解题数 罚时 以及队伍名 我们需要把这三种信息作为一个整体再将这个整体按照内部的信息(解题数以及罚时)进行排序
这个时候我们就需要用到结构体了 也就是这个东西
然后利用sort函数将结构体进行排序 但是这里我们需要自定义一个比较函数 按照自己的想法将结构体进行排序 这也就是代码中的cmp函数的作用
这里用到了三木运算符 不了解的同学可以百度一下他的用法 这里的cmp可以理解为先比较a和b的解题数,解题数多的在前,解题数一样再比较罚时,罚时多的在后
这样之后通过sort函数进行排序再按顺序输出id就可以解决问题了!
贴一下代码
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> #include<set> #define LL long long using namespace std; const int M=1e5+7; int T,n; struct node{int id,k,w;}e[M];//k表示解题数w表示罚时id表示队伍名 bool cmp(node a,node b){return a.k==b.k?a.w<b.w:a.k>b.k;}//自定义的比较函数 int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=n;i++){ e[i].id=i; scanf("%d %d",&e[i].k,&e[i].w); } sort(e+1,e+1+n,cmp);//排序 for(int i=1;i<=n;i++) printf("%d ",e[i].id); puts("");//puts("")作用只是换行 } return 0; }
T2
这道题的话 我的做法和题解中的做法一样qwq 师兄讲的也非常清楚 这里就直接引用了
贴一下代码
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> #include<set> #define LL long long using namespace std; const int M=1e6+7; int T,n,l,r; int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); puts("YES"); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int now=(j-1)*n+(i+j-1<=n?i+j-1:i+j-1-n); printf("%d ",now); } puts(""); } } return 0; }
T3