(1)初始化队列 queue
,定义一个队列 //vis 是名字,可自由替换 || int是变量类型,如果是结构体就是结构体名称
(2)入队 vis.push(x)
(3)出队 vis.pop()
(4)判断队列是否为空 vis.empty()
(5)判断队列中元素的数量vis.size()
(6)得到队列的队首元素 vis.front()
ps:如果是c语言,就要加头文件#include < queue >
#include
using namespace std;
queue<int>q;
int main()
{
int n,m,i,k=0,s;
cin>>n>>m;
for(i=1;i<=n;i++)
q.push(i);
while(q.size()>1)
{
s=q.front();
q.pop();
k++;
if(k%m!=0)//让第m个离开,其他人继续放进去
q.push(s);
}
printf("%d",q.front());
return 0;
}
本题注意的问题:
当剩下的牌数小于p时,也是要翻的!
例如: p=3; 还剩下的编号 为4 和5;
第1次翻:5 4;
第2次翻:4 5;
第3次翻:5 4;
也是要翻3次的,哪怕就剩下1张牌了,也要翻P次!
#include
using namespace std;
int a[100002];//用数组记下good牌的位置
queue<int>q;
int main()
{
int n,k,p,i,m,tmp;
int num=0,w=0;
cin>>n>>k>>p;
m=k/n;//有几张good牌
for(i=1; i<=k; i++)
q.push(i);
while(!q.empty())//根据题目意思,每一次给大家发牌,都应该有一张good牌
{
tmp=q.front();
q.pop();
num++;
if(num%n==0)//看是不是good牌是就放进数组
a[w++]=tmp;//因为小明是发牌员,所以能看牌
if(!q.empty())
for(i=1; i<=p; i++)//按要求放牌
{
int y=q.front();
q.pop();
q.push(y);
}
}
sort(a,a+m);//排序输出就行
for(i=0; i<m; i++)
printf("%d\n",a[i]);
return 0;
}
这题是第一题的升级版
来了来了,酒桌逢7游戏
这题是结构体&&字符串&&队列&&结构体数组的混合运用
#include
using namespace std;
struct s
{
int num;
string name;
} p[1005];
queue<s>q;
bool judge(int x)
{
if(x%7==0) return 1;//不仅能被7整除
while(x)
{
if(x%10==7) return 1;//个位数是7也要出局
x=x/10;//检查其它位数是不是7
}return 0;
}
int main()
{
int n,m,t,i;
cin>>n>>m>>t;
for(i=1; i<=n; i++)
{
cin>>p[i].name;//先放入结构体中
p[i].num=i;//记下脚标
}
for(i=1; i<=n; i++)
q.push(p[i]);//放入队列中
for(i=1; i<=m-1; i++)//排序,让第m个人去到第一个位置
{
q.push(p[i]);
q.pop();
}
while(q.size()>1)
{
s tmp=q.front();
q.pop();
if(!judge(t))
q.push(tmp);
t++;
}
printf("%s\n",q.front().name.c_str());//这个输出的格式,简直是精华!!!
return 0;
}
#include
using namespace std;
struct s{
int t;
int x;
};
queue<s>q;
int n,t,k,i,x,num[300005],ans=0;
int main()
{
s tmp;
cin>>n;
for(i=1; i<=n; i++)
{
cin>>t>>k;
for(int j=1; j<=k; j++)
{
cin>>x;
q.push({t,x});
if(num[x]==0)
ans++;
num[x]++;
}
while(t-q.front().t>=86400)
{
tmp=q.front();
q.pop();
int x1=tmp.x;
num[x1]--;
if(num[x1]==0)
ans--;
}
cout<<ans<<endl;
}
return 0;
}
#include
using namespace std;
queue<int>vis1,vis2;
int main()
{
int m,n,k,a1,b1;
int i;
cin>>m>>n;
cin>>k;
for(i=1; i<=m; i++)
vis1.push(i);
for(i=1; i<=n; i++)
vis2.push(i);
for(i=1; i<=k; i++)
{
a1=vis1.front();
vis1.pop();
b1=vis2.front();
vis2.pop();
printf("%d %d\n",a1,b1);
vis1.push(a1);
vis2.push(b1);
}
return 0;
}
方法名 | 说明 |
---|---|
q.empty() |
检测是否为空 |
q.size() |
返回实际数据个数 |
q.top() |
返回顶端元素 |
q.push(x) |
插入一个元素x |
q.pop() |
移除队首元素 |
#include
using namespace std;
struct node
{
int kk,yy;
};
bool operator < (const node &s1,const node &s2)
{
if(s1.kk!=s2.kk)return s1.kk>s2.kk;
return s1.yy>s2.yy;
}
priority_queue<node>q;//不需要vector
int n,i,x;
int main()
{
cin>>n;
for(i=1; i<=n; i++)
{
cin>>x;
q.push({x,i});
}
double sum=0.0,t=0.0;
while(!q.empty())
{
node p=q.top();
q.pop();
sum=sum+t;
t=p.kk*1.0+t;
q.empty()?printf("%d\n",p.yy):printf("%d ",p.yy);//?的用法,前者是真,后者是假
}
printf("%.2lf\n",sum/(n*1.0));
return 0;
}
注意比较函数的书写方法。
#include
using namespace std;
priority_queue<long,vector<long>,greater<long> >q;
long int n,i,x1,x2,x,sum=0;
int main()
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>x;
q.push(x);
}
while(q.size()>1)
{
x1=q.top();q.pop();
x2=q.top();q.pop();
q.push(x1+x2);
sum=x1+x2+sum;
}
printf("%ld\n",sum);
return 0;
}
#include
using namespace std;
priority_queue<long,vector<long>,greater<long> >q;
long int n,i,x1,x2,x,k=1;
int main()
{
while(scanf("%d",&n)!=-1)
{
int sum=0;
for(i=1; i<=n; i++)
{
cin>>x;
q.push(x);
}
while(q.size()>1)
{
x1=q.top();q.pop();
x2=q.top();q.pop();
q.push(x1+x2);
sum=x1+x2+sum;
}
printf("%ld\n",sum);
q.pop();
}
return 0;
}
#include
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int x,n,k,i;
int main()
{
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d",&k);
if(k==1)scanf("%d",&x),q.push(x);
else if(k==2)printf("%d\n",q.top());
else q.pop();
}
return 0;
}
#include
using namespace std;
priority_queue<long long,vector<long long>,greater<long long> >q;
long long n,i,x1,x2,x,sum=0;
int main()
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>x;q.push(x);
}
while(q.size()>1)
{
x1=q.top();q.pop();
x2=q.top();q.pop();
q.push(x1+x2);
sum=x1+x2+sum;
}
printf("%lld\n",sum);
return 0;
}
#include
using namespace std;
int x,y,k;string tp;
struct p
{
int id,per,val;
};
int operator < (const p &a,const p &b)
{
if (a.val!=b.val) return (a.val>b.val);
else
return (a.id > b.id);
}
priority_queue<p>vis;
int main()
{
ios::sync_with_stdio(false);
while(cin>>tp)
{
if (tp=="#") break;
cin>>x>>y;
vis.push({x,y,y});
}
cin>>k;
p tmp;
for(int i=1;i<=k;i++)
{
tmp=vis.top();
cout<<tmp.id<<endl;
vis.push({tmp.id,tmp.per,tmp.val+tmp.per});
vis.pop();
}
return 0;
}