题目A
## 1使用队列
#include <bits/stdc++.h>
using namespace std;
struct node//结构体储存原始数据和经转换后的数据
{
int x,y;
};
bool operator <(const node &s1,const node &s2)//队列中元素按y从小到大排序
{
return s1.y>s2.y;
}
priority_queue<node,vector<node> >vis;
int main()
{
int t;
ios::sync_with_stdio(false);
while(cin>>t)
{
while(t--)
{
int m,n,x,y=0;
cin>>x;
m=x;
while(x>0)
{
n=x%10;
y=y*10+n;
x=x/10;
}
vis.push({m,y});
}
while(!vis.empty())
{
node ans=vis.top();
vis.pop();
vis.empty()?cout<<ans.x<<endl:cout<<ans.x<<" ";
}
}
return 0;
}
## 2使用sort函数
#include <bits/stdc++.h>
using namespace std;
struct poi{
string x;//定义为字符串
int y;
}p[30];
bool cmp(poi a,poi b)
{
return a.y<b.y;
}
int main()
{
int i,j,n,m;
string s;
while(cin>>n)
{
for(i=0;i<n;i++)
{
cin>>s;
p[i].x=s;
int sum=0;
for(j=s.size()-1;j>=0;j--)
{
sum*=10;
sum+=s[j]-'0';//转化为字符之间的差值
}
p[i].y=sum;
}
sort(p,p+n,cmp);
for(i=0;i<n-1;i++)cout<<p[i].x<<" ";
cout<<p[n-1].x<<'\n';
}
return 0;
}
题目B
队列的使用
#include <bits/stdc++.h>
using namespace std;
queue<int>vis;
int main()
{
int t;
ios::sync_with_stdio(false);
while(cin>>t)
{
while(t--)
{
int m[50],n,x,y,j=0,i;
cin>>n;
if(n==1)//考虑特殊情况
{
cout<<"1"<<endl;
continue;
}
for(i=1;i<=n;i++)
{
vis.push(i);
}
while(vis.size()>1)
{
x=vis.front();
vis.pop();
m[++j]=x;
y=vis.front();
vis.pop();
vis.push(y);
}
for(i=1;i<j;i++)
{
cout<<m[i]<<",";
}
cout<<m[j]<<endl;//注意输出方式
int ans=vis.front();
vis.pop();
cout<<ans<<endl;
}
}
return 0;
}
题目C
因为素数之间的间隔很小,所以两个for循环不会花很长时间。
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int f[N],prime[N],cnt=0;
void init()
{
memset(f,0,sizeof(f));
f[0]=f[1]=1;
for(int i=2;i<N;i++)
{
if(!f[i]) prime[cnt++]=i;
for(int j=0;j<cnt&&prime[j]*i<N;j++)
{
f[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
int main()
{
ios::sync_with_stdio(0);
init();
int T;long long sum=0;
cin>>T;
while(T--)
{
int l,r,flag1=0,flag2=0; cin>>l>>r;
int a1=0,a2=0;
for(int i=l;i<=r;i++)
{
if(!f[i])
{
flag1=1;a1=i;break;
}
}
for(int i=r;i>=l;i--)
{
if(!f[i]
{
flag2=1;a2=i;break;
}
}
if(flag1&&flag2)
sum+=a1+a2;
}
cout<<sum<<endl;
return 0;
}
题目D
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
priority_queue<ll,vector<ll>,greater<ll> >vis;
int main()
{
ll i;
ll ans,n,x,m,y;
//ios::sync_with_stdio(false);
while(scanf("%lld",&n)!=EOF)
{
ans=0;
for(i=1;i<=n;i++)
{
scanf("%lld",&m);
vis.push(m);
}
if(n==1)
{
printf("%lld\n",m);
vis.pop();
continue;
}
while(vis.size()>1)
{
x=vis.top();
vis.pop();
y=vis.top();
vis.pop();
ans=x+y;
vis.empty()?printf("%lld\n",ans):printf("%lld ",ans);
vis.push(ans);
}
vis.pop();
}
return 0;
}
题目E
#include <bits/stdc++.h>
using namespace std;
queue<int>vis;
typedef long long ll;
const int N=1e7;
int p[N+10],cnt=0,m=N+10;
bool b[N+10];
int init()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
for(int i=2;i<=m;i++)
{
if(b[i])
p[++cnt]=i;
for(int j=1;j<=cnt&&p[j]*i<=m;j++)
{
b[p[j]*i]=0;
if(i%p[j]==0)
break;
}
}
return 0;
}
int main()
{
ios::sync_with_stdio(false);
int t;
ll n,i,x,s,y=0;
cin>>t;
while(t--)
{
init();
cin>>n;
if(n==1)//注意特殊情况
{
cout<<"1"<<endl;
continue;
}
for(i=1;i<=n;i++)
{
if(b[i]==1)
vis.push(i);
}
while(vis.size()>1)
{
x=vis.size();
for(i=1;i<=x;i++)
{
s=vis.front();
vis.pop();
if(b[i]==1)
{
vis.push(s);
}
}
}
y=vis.front();
vis.pop();
cout<<y<<endl;
}
return 0;
}
题目F
发现规律,打表
#include<bits/stdc++.h>
using namespace std;
int a[12] = {1,2,3,5,11,31,127,709,5381,52711,648391,9737333};
int main() {
int T;
cin>>T;
while(T--) {
int n,ans;
cin>>n;
for(int i = 0;i<12;i++)
if(a[i] <= n) ans = a[i];
cout<<ans<<'\n';
}
}
我也不是很懂
#include <bits/stdc++.h>
using namespace std;
const int MAX=1e7+5;
int cnt,su[MAX/10],sum[MAX+5],daan[MAX+5];
bool isprime[MAX+5];
void prime()
{
cnt=1;
memset(isprime,1,sizeof(isprime));
isprime[0]=isprime[1]=0;
for(long long i=2;i<=MAX;i++)
{
if(isprime[i])
su[cnt++]=i;
for(long long j=1;j<cnt&&su[j]*i<MAX;j++)
{
isprime[su[j]*i]=0;if(!(i%su[j]))break;
}
}
}
int main()
{
int i,j,n,m,t;
prime();sum[0]=0;
daan[0]=1;
for(i=1;i<=MAX;i++)
{
sum[i]=sum[i-1];
if(isprime[i])
{
sum[i]++;
if(daan[sum[i]]==daan[i-1])daan[i]=i;
else daan[i]=daan[i-1];
}
else daan[i]=daan[i-1];
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%d\n",daan[n]);
}
return 0;
}
题目G
最多使用 m 个间隔,不必遍历所有间隔
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node
{
int l;
int p;
int q;
};
bool operator<(node a, node b)
{
return a.l>b.l;
}
priority_queue<node>vis;
priority_queue <int,vector<int>,greater<int> > vit;
int a[500005];
int main()
{
int i,x,n,m;
cin>>n>>m;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=m;i++)
{
scanf("%d",&x);
vit.push(x);
}
for(i=1;i<n;i++)
{
vis.push((node){a[i+1]-a[i],i,i+1});
}
int flag=1;
while(!vit.empty())
{
int ty=vit.top();
vit.pop();
if(vis.empty()||vis.top().l>ty)
{
flag=0;break;
}
else
{
node x=vis.top();
vis.pop();
if(x.q+1<=n)
{
vis.push((node){a[x.q+1]-a[x.p],x.p,x.q+1});
}
}
}
if(flag)cout<<"yes"<<endl;
else cout<<"no"<<endl;
return 0;
}