栈
A1051
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
int main(){
int M,N,K,m,cnt;
vector<int> v;
scanf("%d%d%d",&M,&N,&K);
for(int i=0;i<K;i++){
v.clear();
stack<int> s;
cnt=0;
for(int j=0;j<N;j++){
scanf("%d",&m);
v.push_back(m);
}
for(int k=1;k<=N&&s.size()<M;k++){
s.push(k);
while(!s.empty()&&cnt<=N&&s.top()==v[cnt]){
s.pop();
cnt++;
}
}
if(s.empty()){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
队列
A1056
思路:
结构体如下:
struct node{
double weight;//记录每只老鼠的重量
int turn;//记录每只老鼠比赛的轮数
int id;//记录老鼠的id,用于改变turn
};
对于同一turn的各个选手,用cnt记录当前组有几个人比赛,如果cnt不符合要求则退出循环。
用数组p记录每一轮比赛的人数,用于后面的rank的打印。
注意:最后一轮只有一个人,要自己附上值。
关键:
这里要注意,第三行给的是各个选手的出场顺序,数字是各个选手的id
ac代码:
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
struct node{
double weight;
int turn;
int id;
}a[1010];
int p[1010]={0};
int main(){
int m,n;
queue<node> q;
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++){
scanf("%lf",&a[i].weight);
a[i].id = i;
a[i].turn = 1;
}
for(int i=0,t;i<m;i++){
scanf("%d",&t);
q.push(a[t]);
}
int turn = 1;
while(q.size()>1){
while(turn==q.front().turn){
int cnt = 0;
double MAX = -1;
int maxindex = -1;
while(!q.empty()&&turn==q.front().turn&&cnt<n){
if(MAX<q.front().weight){
MAX = q.front().weight;
maxindex = q.front().id;
}
q.pop();
p[turn]++;
cnt++;
}
a[maxindex].turn++;//进行下一轮
q.push(a[maxindex]);
}
turn++;
}
p[turn] = 1;//最后一轮只有1人
for(int i=0;i<m;i++){
if(i!=0)
printf(" ");
printf("%d",p[a[i].turn+1]+1);
}
}
链表
A1032
常规模拟题
#include<cstdio>
using namespace std;
struct Node{
char data;
int next;
bool flag;
Node(){flag=false;}
}a[100010];
int main(){
int m,n,N,s,t;
char c;
scanf("%d %d %d",&m,&n,&N);
for(int i=0;i<N;i++){
scanf("%d %c %d",&s,&c,&t);
a[s].data = c;
a[s].next = t;
}
int k = m;
while(k!=-1){
a[k].flag = true;
k = a[k].next;
}
k = n;
while(k!=-1){
if(a[k].flag)
break;
k = a[k].next;
}
if(k==-1){
printf("-1\n");
}else{
printf("%05d\n",k);
}
}
A1052
#include<cstdio>
#include<algorithm>
using namespace std;
struct Node{
int address,data,next;
int flag;
Node(){flag = 0;}
}a[100010];
bool cmp(Node a,Node b){
if(!a.flag||!b.flag){
return a.flag > b.flag;
}
return a.data < b.data;
}
int main(){
int n,head,address,data,next;
scanf("%d%d",&n,&head);
for(int i=0;i<n;i++){
scanf("%d%d%d",&address,&data,&next);
a[address].address = address;
a[address].data = data;
a[address].next = next;
}
int k = head;
int cnt = 0;
while(k!=-1){
a[k].flag = 1;
cnt++;
k = a[k].next;
}
if(cnt==0){
printf("0 -1");
return 0;
}
sort(a,a+100010,cmp);
printf("%d %05d\n",cnt,a[0].address);
for(int i=0;i<cnt;i++){
if(i==cnt-1)//处理-1的情况
printf("%05d %d -1\n",a[i].address,a[i].data);
else
printf("%05d %d %05d\n",a[i].address,a[i].data,a[i+1].address);
}
}
A1074
思路:
按照模板做就行
关键:
每次排序时要注意排序的范围,首先是对全体Node排序,因此范围为(a,a+maxn),然后是在每一个循环内进行逆向排序。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100010;
struct Node{
int address,data,next,flag,order;
Node(){flag = 0;}
}a[maxn];
bool cmp1(Node a,Node b){
if(a.flag==0||b.flag==0)
return a.flag > b.flag;
return a.order < b.order;
}
bool cmp2(Node a,Node b){
return a.order > b.order;
}
int main(){
int head,N,K,address,data,next;
scanf("%d %d %d",&head,&N,&K);
for(int i=0;i<N;i++){
scanf("%d %d %d",&address,&data,&next);
a[address].address=address;
a[address].data = data;
a[address].next = next;
}
int k = head,cnt = 0;
while(k!=-1){
a[k].flag = 1;
cnt++;
a[k].order = cnt;
k = a[k].next;
}
if(cnt==0){
printf("%05d 0 -1\n",head);
return 0;
}
sort(a,a+maxn,cmp1);
for(int k = 0;k+1<=(cnt/K);k++){
sort(a+k*K,a+(k+1)*K,cmp2);
}
for(int i=0;i<cnt;i++){
if(i==cnt-1)
printf("%05d %d -1\n",a[i].address,a[i].data);
else
printf("%05d %d %05d\n",a[i].address,a[i].data,a[i+1].address);
}
return 0;
}
A1097
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
const int maxn = 100010;
struct Node{
int address,data,next,flag,order;
Node(){flag = 0;}
}a[maxn];
bool cmp(Node a,Node b){
if(!a.flag||!b.flag)
return a.flag > b.flag;
return a.order < b.order;
}
int main(){
int head,N,address,data,next;
scanf("%d %d",&head,&N);
for(int i=0;i<N;i++){
scanf("%d %d %d",&address,&data,&next);
a[address].address = address;
a[address].data = data;
a[address].next = next;
}
int k = head,cnt=0;
while(k!=-1){
a[k].flag = 1;
cnt++;
a[k].order = cnt;
k = a[k].next;
}
sort(a,a+maxn,cmp);
set<int> s;
vector<Node> v1;
vector<Node> v2;
for(int i=0;i<cnt;i++){
if(s.find(abs(a[i].data))==s.end()){
s.insert(abs(a[i].data));
v1.push_back(a[i]);
}
else
v2.push_back(a[i]);
}
for(int i=0;i<v1.size();i++){
if(i==v1.size()-1){
printf("%05d %d -1\n",v1[i].address,v1[i].data);
}else{
printf("%05d %d %05d\n",v1[i].address,v1[i].data,v1[i+1].address);
}
}
for(int i=0;i<v2.size();i++){
if(i==v2.size()-1){
printf("%05d %d -1\n",v2[i].address,v2[i].data);
}else{
printf("%05d %d %05d\n",v2[i].address,v2[i].data,v2[i+1].address);
}
}
}