约瑟夫 酒桌 报数 等问题
运用队列可以将这些情况模拟。
#include <bits/stdc++.h>
using namespace std;
struct sp{
char name[50];
int k;
}s[100010];
queue<int>a;
int judge( int n){
if(n%7==0)
return 1;
int k=n;
while(k>0){
int s=k%10;
if(s==7)
return 1;
k/=10;}
return 2;
}
int main()
{
int n,m,t;
while(cin>>n>>m>>t){
for(int i=1;i<=n;i++){
cin>>s[i].name;
s[i].k=i;
a.push(i);
}
for(int i=0;i<m-1;i++){
int y=a.front();
a.pop();
a.push(y);
}
while(a.size()!=1){
int ans=judge(t);
if(ans==2){
int w=a.front();
a.pop();
a.push(w);
}
else
a.pop();
t++;
}
int q=a.front();
printf("%s\n",s[q].name);}
return 0;
}
用结构体队列好像更容易。
报数
#include <bits/stdc++.h>
using namespace std;
queue<int>a;
int main()
{
int n,k;
while(cin>>n>>k){
for(int i=1;i<=n;i++)
a.push(i);
int num=1;
while(a.size()!=1){
if(num%k==0)
a.pop();
else{
int x=a.front();
a.pop();
a.push(x);
}
num++;
}
int ans=a.front();
cout<<ans<<endl;
}
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+1;
struct s{
int t,x;
};//用结构体绑定人和时间。
queue<s>vis;
int n,t,k,x,ans=0;
int num[N];
int main()
{
struct s ac;
scanf("%d",&n);
while(n--){
scanf("%d %d",&t,&k);
for(int j=1;j<=k;j++){
scanf("%d",&x);
vis.push({t,x});
if(num[x]==0)
ans++;//国家数。
num[x]++;
}
while(t-vis.front().t>=86400){//判断符合条件的船。
ac=vis.front();
vis.pop();
int y=ac.x;
num[y]--;
if(num[y]==0)
ans--;
}
cout<<ans<<endl;
}
return 0;
}
更新一道刚做的
这一题看题头插入、删除准备用链表莽一发(虽然不会。。)
神奇的是,把链表换成vector+O2后过了。。。
上代码!!
洛谷 1160 队列安排
#include <bits/stdc++.h>
using namespace std;
vector<int>q;//用vector实现插入。
int n,k,p;
vector<int>::iterator it;
bool x[100010];//用于记录被删除的数,比调用erase函数更快。。
int main()
{
q.push_back(1);//先将1输入。
scanf("%d",&n);
for(int i=2;i<=n;i++){
scanf("%d %d",&k,&p);
it=find(q.begin(),q.end(),k);//find函数可以返回k的位置。
if(p){//右边。
it++;//右边的话位置要向右移动一位。
q.insert(it,i);}//插入函数是将数插入到位置前一位。
else
q.insert(it,i);
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d",&n);
x[n]=1;}//记录被删除的数。
for(it=q.begin();it!=q.end();it++)//用迭代器实现输出。
if(!x[*it])
printf("%d ",*it);
printf("\n");
return 0;
}
再补充一个next_permutation也是c++stl里面的函数,用到全排列枚举比较多
洛谷 1706
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[10];
for(int i=0;i<n;i++)
a[i]=i+1;
do{//避免少打了一种!
for(int i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
}while(next_permutation(a,a+n));
}