目录
1.List Sorting
不能用等于号直接判断数组是否相等,要用strcmp函数
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
struct stu{
int id;
char name[10];
int score;
}martix[100004];
int m;
bool cmp(stu a,stu b){
if(m==1){
return a.id<b.id;
}else if(m==2){
if(strcmp(a.name,b.name)!=0) return strcmp(a.name,b.name)<0;
else return a.id<b.id;
}else{
if(a.score!=b.score) return a.score<b.score;
else return a.id<b.id;
}
}
int main(){
int n;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d %s %d",&martix[i].id,&martix[i].name,&martix[i].score);
}
sort(martix,martix+n,cmp);
for(int i=0;i<n;i++){
printf("%06d %s %d\n",martix[i].id,martix[i].name,martix[i].score);
}
return 0;
}
2.The World's Richest
这一题会有两个测试点超时。
如果进行下面这种预处理便可以避免
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
struct stu{
char name[10];
int age;
int wealth;
}martix[100005];
bool cmp(stu a,stu b){
return a.age<b.age;
}
bool cmp2(stu a,stu b){
if(a.wealth!=b.wealth) return a.wealth>b.wealth;
else if(a.age!=b.age) return a.age<b.age;
else return strcmp(a.name,b.name)<0;
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%s %d %d",&martix[i].name,&martix[i].age,&martix[i].wealth);
}
int num,start,end;
for(int i=0;i<m;i++){
sort(martix,martix+n,cmp);
scanf("%d %d %d",&num,&start,&end);
printf("Case #%d:\n",i+1);
int l=0,r=n-1;
while(martix[l].age<start){
l++;
}
while(martix[r].age>end){
r--;
}
if(l>r){
printf("None\n");
continue;
}
sort(martix+l,martix+r+1,cmp2);
if(num>r-l+1) num=r-l+1;
for(int j=l;j<l+num;j++){
printf("%s %d %d\n",martix[j].name,martix[j].age,martix[j].wealth);
}
}
return 0;
}
3.PAT Judge
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
struct stu{
int id;
bool flag=false;
int get[6]={-1,-1,-1,-1,-1,-1};
int man=0;
int rank;
int whol=0;
}martix[10005];
int score[5],k;
bool cmp(stu a,stu b){
if(a.flag!=b.flag) return a.flag>b.flag;
else if(a.whol!=b.whol) return a.whol>b.whol;
else if(a.man!=b.man) return a.man>b.man;
else if(a.id!=b.id) return a.id<b.id;
}
int main(){
int n,m;
scanf("%d %d %d",&n,&k,&m);
for(int i=1;i<=k;i++){
scanf("%d",&score[i]);
}
int name,q,s;
for(int i=0;i<m;i++){
scanf("%d %d %d",&name,&q,&s);
if(s!=-1) martix[name].flag=true;
if(s==-1&&martix[name].get[q]==-1) martix[name].get[q] = 0;
if(s==score[q]&&martix[name].get[q]!=s) martix[name].man+=1;
if(martix[name].get[q]<s) martix[name].get[q] = s;
}
for(int i=1;i<=n;i++){
martix[i].id=i;
for(int j=1;j<=k;j++){
if(martix[i].get[j]!=-1){
martix[i].whol+=martix[i].get[j];
}
}
}
sort(martix+1,martix+n+1,cmp);
martix[1].rank=1;
for(int i=2;i<=n;i++){
if(martix[i].whol==martix[i-1].whol) martix[i].rank=martix[i-1].rank;
else martix[i].rank=i;
}
for(int i=1;i<=n;i++){
printf("%d %05d %d ",martix[i].rank,martix[i].id,martix[i].whol);
for(int j=1;j<=k;j++){
if(martix[i].get[j]==-1){
printf("-");
}else{
printf("%d",martix[i].get[j]);
}
if(j!=k){
printf(" ");
}
}
if(martix[i+1].flag==false){
break;
}
printf("\n");
}
return 0;
}
4.List Grades
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
struct stu{
char name[12];
char id[12];
int score;
}martix[100005];
bool cmp(stu a,stu b){
return a.score>b.score;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s %s %d",&martix[i].name,&martix[i].id,&martix[i].score);
}
sort(martix,martix+n,cmp);
int start,end;
scanf("%d %d",&start,&end);
int l=0,r=n-1;
while(martix[l].score>end){
l++;
}
while(martix[r].score<start){
r--;
}
if(l>r){
printf("NONE\n");
}else{
for(int i=l;i<=r;i++){
printf("%s %s\n",martix[i].name,martix[i].id);
}
}
return 0;
}
5.Graduate Admission
30分只能那22分
第一,我没有算排名,是临时判断的
第二,每个学校的录取人数,最后一个录取的,真正录取的人数,其实是好几个属性,可以用一个结构体将他们包括起来,不用像我那样临时判断
下次刷的时候再追求满分了
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
struct stu{
int id;
int ge;
int gi;
int final;
int dream_school[5];
}martix[40005];
bool cmp(stu a,stu b){
if(a.final!=b.final) return a.final>b.final;
else if(a.ge!=b.ge) return a.ge>b.ge;
}
bool cmp1(int a,int b){
return a<b;
}
int main(){
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
int school[100];
for(int i=0;i<m;i++){
scanf("%d",&school[i]);
}
for(int i=0;i<n;i++){
martix[i].id=i;
scanf("%d %d",&martix[i].ge,&martix[i].gi);
martix[i].final = martix[i].ge+martix[i].gi;
for(int j=0;j<k;j++){
scanf("%d",&martix[i].dream_school[j]);
}
}
sort(martix,martix+n,cmp);
int admiss[100][4000];
int num[100]={0};
int temp,last;
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
temp = martix[i].dream_school[j];
if(school[temp]==0) continue;
if(num[temp]<school[temp]){
admiss[temp][num[temp]]=martix[i].id;
num[temp]++;
break;
}else{
last=admiss[temp][num[temp]-1];
if(martix[i].final==martix[last].final&&martix[i].ge==martix[last].ge){
admiss[temp][num[temp]] = martix[i].id;
num[temp]++;
break;
}
}
}
}
for(int i=0;i<m;i++){
sort(admiss[i],admiss[i]+num[i],cmp1);
for(int j=0;j<num[i];j++){
printf("%d",admiss[i][j]);
if(j!=num[i]-1) printf(" ");
}
if(i!=m-1) printf("\n");
}
return 0;
}