T1
题面
题意
输入一个数,输出最多个质数,使和为该数。
方法
尽量多打2,奇数则再加一个3.
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i,k;
cin>>n;
k=n/2;
if(n%2==1)
{
cout<<k<<endl<<3;
for(i=1;i<=k-1;i++)
{
cout<<" "<<2;
}
}
else
{
cout<<k<<endl;
for(i=1;i<=k;i++)
cout<<2<<" ";
}
}
T2
题面
题意
输入三个点的坐标,输出n和n个坐标,使四个点构成平行四边形。
方法
用其中两坐标之和等于其余两坐标之和的性质来做(平行四边形的对角线互相平分)
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x,y,x2,y2,x3,y3,x4,y4;
cin>>x>>y>>x2>>y2>>x3>>y3;
cout<<3<<endl;
x4=x+x2-x3;
y4=y+y2-y3;
cout<<x4<<" "<<y4<<endl;
x4=x-x2+x3;
y4=y-y2+y3;
cout<<x4<<" "<<y4<<endl;
x4=-x+x2+x3;
y4=-y+y2+y3;
cout<<x4<<" "<<y4<<endl;
}
T3
题面
题意
输入n和n个字符D或R,循环进行杀人,D让第一个R删去。
方法
让D和R的序号分别入D,R两队列.分别出一个数,较小数+n后入原队列.
再判断两队列是否为空,输出非空的队列
队列使用方法
用queue<>来定义,<>内写队列内的数据类型,如int.
1.队列D.push(x)表示x如D队列.
2.D.pop()表示删去队首.
3.D.front()表示队首.
4.D.empty()是bool型的,true表示队列为空.
超时的模拟代码(链表实现)
#include<bits/stdc++.h>
#define ll long long
#define N 200010
using namespace std;
int b[N],c[N];
int main()
{
int len,x=0,y=0,tx=0,ty=0,i,n;
string a;
cin>>len;
cin>>a;
if(len==1)
{
cout<<a;
return 0;
}
for(i=0;i<=len-1;i++)
{
if(a[i]=='D') x++;
b[i]=i+1;
c[i]=i-1;
}
b[len-1]=0;
c[0]=len-1;
y=len-x;
n=0;
while(1)
{
if(a[n]=='D')
{
if(tx==0)
{
y--;
ty--;
}
else
{
tx++;
c[b[n]]=c[n];
b[c[n]]=b[n];
}
}
else if(a[n]=='R')
{
if(ty==0)
{
x--;
tx--;
}
else
{
ty++;
c[b[n]]=c[n];
b[c[n]]=b[n];
}
}
if(x==0)
{
cout<<"R";
return 0;
}
else if(y==0)
{
cout<<"D";
return 0;
}
n=b[n];
}
}
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
queue<int> D,R;
int main()
{
int n,x,y,i;
char a;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a;
a=='D'?D.push(i):R.push(i);
//"?"和":"的用法 "?"为条件,满足则执行"?"与":"间的操作.不满足则执行":"后的操作
}
while(D.empty()==false&&R.empty()==false)
{
x=D.front();y=R.front();
D.pop();R.pop();
x<y?D.push(x+n):R.push(y+n);
}
D.empty()?cout<<"R":cout<<"D";
}
T4
题面
题意
输入n,输出k,使(3^l)*k大于n,且n%(3^l)不为0.
要在(3^l)*k-n的值最小的情况下,k尽可能大.
方法
用while算出l的最小值,输出n/(3^l)+1即可.
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll n,k=3,i=1,j,m,ans=0;
cin>>n;
while(n%k==0)
{
k*=3;
}
cout<<n/k+1;
}
T5
题面
题意
在n*n的正方形的边缘上有一些细胞,它们都要去另一边,每秒一格,且有m个坏点,行动时不能碰到坏点和其余细胞,则最多放几个细胞.
方法
用两个初值均为true的bool数组表示行和列,若与坏点有一坐标相同则变为false.
若n为奇数,则判断中间行和中间列,若均为true,则ans–.因为两细胞必然相撞.
其余行列的细胞若会向撞,则可将它换到正方形的另外一段.
代码
#include<bits/stdc++.h>
#define ll long long
#define N 1001
using namespace std;
ll n,m;
bool hang[N],lie[N];
int main()
{
ll i,j,x,y,ans=0;
cin>>n>>m;
memset(hang,true,sizeof(hang));
memset(lie,true,sizeof(lie));
for(i=1;i<=m;i++)
{
cin>>x>>y;
lie[y]=hang[x]=false;
}
for(i=2;i<=n-1;i++)
{
if(hang[i]==true) ans++;
if(lie[i]==true) ans++;
}
if(n%2==1)
{
if(hang[n/2+1]==true&&lie[n/2+1]==true) ans--;
}
cout<<ans;
}