一波pta上的数据结构题
/***
5
1 3 5 7 9
2 3 4 5 6
***/
#include <iostream>
#include <algorithm>
#include <string.h>
#define N 200005
using namespace std;
int a[N];
int main()
{
int n,m,i,l=0;
cin>>n;
for(i=0;i<n;i++){
cin>>m;
a[l++]=m;
}
for(i=0;i<n;i++){
cin>>m;
a[l++]=m;
}
sort(a,a+l);
cout<<a[n-1]<<endl;
return 0;
}
堆栈操作合法性
点击打开链接
#include <iostream>
#include <stdio.h>
#include<string.h>
#define N 1100
using namespace std;
char s[105];
int main()
{
int n,m,i,j,l,len,flag=0;
cin>>n>>m;
getchar();
for(i=0;i<n;i++){
gets(s);
len=strlen(s);
l=0;flag=0;
for(j=0;j<len;j++){
if(s[j]=='S'){
l++;
if(l>m){
cout<<"NO"<<endl;
flag=1;
break;
}
}
if(s[j]=='X'){
l--;
if(l<0) break;
}
}
if(flag==0){
if(l==0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}
/***
8 2 1 3 9 4 11 13 15
输出样例:
1 3 2 9 11 4 13 15
***/
#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>
#define N 200005
using namespace std;
int a[N];
int main()
{
int n,i,m,t1,t2,l=0,p1=0,p2=0;
cin>>n;
queue<int>q1,q2;
for(i=0;i<n;i++){
cin>>m;
if(m%2==1)
q1.push(m);
else
q2.push(m);
}
while(!q1.empty()||!q2.empty()){
p1=0;p2=0;
while(!q1.empty()&&p1<1){
t1=q1.front();
q1.pop(); l++;
if(l==1)
cout<<t1;
else
cout<<" "<<t1;
t1=q1.front();
q1.pop(); l++;
if(l==1)
cout<<t1;
else
cout<<" "<<t1;
p1++;
}
while(!q2.empty()&&p2<1){
t2=q2.front();
q2.pop(); l++;
if(l==1)
cout<<t2;
else
cout<<" "<<t2;
p2++;
}
}
cout<<endl;
return 0;
}
银行排队问题之单队列多窗口问题
这个不是我自己写,忘记是谁的了
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
struct node {
int t,p;
};
int main() {
int n,i,k;
queue <node> q;
scanf("%d", &n);
for(i=0;i<n;i++) {
node tmp;
scanf("%d %d", &tmp.t, &tmp.p);
if(tmp.p>60) tmp.p=60;
q.push(tmp);
}
scanf("%d", &k);
int win[15] = {0}, num[15] = {0},wait = 0, maxn = 0, sum = 0;
while(!q.empty()) {
int flag = 0;
int minn = 0x3f3f3f3f, imin = 0;
for(i = 0; i < k; i++) {
if(win[i] < q.front().t) {
win[i] = q.front().t + q.front().p;
num[i]++;
flag = 1;
q.pop();
break;
}
if(minn > win[i]) {
minn = win[i];
imin = i;
}
}
if(flag == 0) {
wait = win[imin] - q.front().t;
win[imin] += q.front().p;
if(maxn < wait) maxn = wait;
sum += wait;
num[imin]++;
q.pop();
}
}
int last = win[0];
for(i = 0; i < k; i++) {
if(win[i] > last)
last = win[i];
}
printf("%.1lf %d %d\n", sum*1.0/n*1.0,maxn,last);
for(i = 0; i < k; i++) {
printf("%d", num[i]);
if(i!=k-1) printf(" ");
else printf("\n");
}
return 0;
}
模拟EXCEL排序
/**
输入样例:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
输出样例:
000001 Zoe 60
000007 James 85
000010 Amy 90
**/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#define N 111000
using namespace std;
struct student{
char id[25];char name[25];int grade;
};
int n,m;
int com1(struct student a,struct student b){
return strcmp(a.id,b.id)<0;
}
int com2(struct student a,struct student b){
if(strcmp(a.name,b.name)==0)
return strcmp(a.id,b.id)<0;
else
return strcmp(a.name,b.name)<0;
}
int com3(struct student a,struct student b){
if(a.grade==b.grade)
return strcmp(a.id,b.id)<0;
else
return a.grade<b.grade;
}
int main(){
int i;
scanf("%d %d",&n,&m);
//cin>>n>>m;
struct student per[n];
getchar();
for(i=0;i<n;i++)
scanf("%s %s %d",per[i].id,per[i].name,&per[i].grade);
//cin>>per[i].id>>per[i].name>>per[i].grade;
if(m==1)
sort(per,per+n,com1);
if(m==2)
sort(per,per+n,com2);
if(m==3)
sort(per,per+n,com3);
for(i=0;i<n;i++)
printf("%s %s %d\n",per[i].id,per[i].name,per[i].grade);
//cout<<per[i].id<<" "<<per[i].name<<" "<<per[i].grade<<endl;
return 0;
}
统计工龄
#include <iostream>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 1100
using namespace std;
int a[100010],b[55];
int main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++){
cin>>a[i];
b[a[i]]++;
}
for(i=0;i<=50;i++){
if(b[i]>0)
cout<<i<<":"<<b[i]<<endl;
}
return 0;
}