【PAT甲级】1109 Group Photo (25分)(模拟)
2024-09-06 07:40:04
题意:
输入两个整数N和K(N<=1e4,K<=10),分别表示人数和行数,接着输入N行每行包括学生的姓名(八位无空格字母且唯一)和身高(【30,300】的整数)。按照身高逆序,姓名字典序升序将学生从高到矮排列,将学生均分为N行输出,最先输出的一行人数包括除不尽的余数学生,每行中间(如果这一行学生人数为偶数则靠右的为中间)的学生最高,然后依次左边一位学生最高,右边一位学生最高,例如190, 188, 186, 175, 170->175, 188, 190, 186, 170。
trick:
把K看成了每行的学生个数而不是行数(竟然能过前三个数据点)。。。。。
AAAAAccepted code:
#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
pair<int,string>pr[];
bool cmp(pair<int,string>a,pair<int,string>b){
if(a.first!=b.first)
return a.first<b.first;
return a.second>b.second;
}
string ans[];
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n,k;
cin>>n>>k;
for(int i=;i<=n;++i)
cin>>pr[i].second>>pr[i].first;
sort(pr+,pr++n,cmp);
int m=n;
int x=n-n/k*k+n/k;
int cnt=x;
int temp=;
int t=;
int flag=-;
while(cnt--){
ans[x/++temp]=pr[m--].second;
if(flag<)
++t;
temp=t*flag;
flag=-flag;
}
int num=x;
for(int i=;i<k;++i){
int cnt=n/k;
int temp=;
int t=;
int flag=-;
while(cnt--){
ans[num+n/k/++temp]=pr[m--].second;
if(flag<)
++t;
temp=t*flag;
flag=-flag;
}
num+=n/k;
}
for(int i=;i<=x;++i){
cout<<ans[i];
if(i<x)
cout<<" ";
else
cout<<"\n";
}
for(int i=x+;i<=n;++i){
cout<<ans[i];
if((i-x)%(n/k))
cout<<" ";
else if(i<n)
cout<<"\n";
}
return ;
}
最新文章
- Storyboard &; XIB 自己的理解
- Git初级实践教程(图文)
- 多线程中共享变量——CCF总决赛试题
- C++ STL 助记1:vector
- java坦克大战源码下载
- [资料]自动化e2e测试 -- WebDriverJS,Jasmine和Protractor
- android 模拟器定在了任务栏出不来了
- WinMain与WndProc以及窗口诞生过程总结
- VB6之HTTP服务器的实现
- Mtcnn进行人脸剪裁和对齐
- adb server is out of date. killing... ADB server didn&#39;t ACK解决方法
- [HackerRank]New Year Chaos[UNDONE]
- i++ 相比 ++i 哪个更高效?为什么?
- LibreOj 6279数列分块入门 3 练习了一下set
- JS实现网页背景旋转缩放轮播效果
- linux 光盘yum源搭建
- 【VSC】我安装了哪些扩展插件
- 基本UDP套接字编程
- 关于Struts2有时候出现的莫名其妙的错误
- [Chrome] 如何下载老版本的 Chrome