A. The 67 th Integer Problem
思路:
直接输出 x 就行。
代码:
cpp
void solve()
{
int x;
cin>>x;
cout<<x<<endl;
}
B. The 67 th 6-7 Integer Problem
思路:
要最大,排序前六个乘 −1-1−1 就行。
代码:
cpp
void solve()
{
int sum=0;
for(int i=1;i<=7;i++)cin>>a[i];
sort(a+1,a+1+7);
sum+=(a[1]+a[2]+a[3]+a[4]+a[5]+a[6])*-1;
sum+=a[7];
cout<<sum<<endl;
}
C. The 67 th Permutation Problem
思路:
双指针,输出一个小的,两个大的。
代码:
cpp
void solve()
{
int n;
cin>>n;
int l=1,r=3*n;
for(int i=0;i<n;i++){
cout<<l++<<" "<<r--<<" "<<r--<<" ";
}
cout<<endl;
}
D. The 67 th OEIS Problem
思路:
预处理出所有的质数,然后输出相邻质数的乘积,这样可以保证相邻数的最大公约数是某个质数,保证不会重复。
代码:
cpp
const int N=1e4+5;
vector<int> p;
void pre(){
int x=2;
while(p.size()<N){
bool flag=1;
for(int pp :p){
if(pp*pp>x)break;
if(x%pp==0){
flag=0;
break;
}
}
if(flag)p.push_back(x);
x++;
}
return;
}
void solve()
{
int n;
cin>>n;
for(int i=0;i<n;i++){
int x=p[i]*p[i+1];
cout<<x<<" ";
}
cout<<endl;
}
E. The 67 th XOR Problem
思路:
两个数同时异或相同值,异或结果不变,所以直接两重循环去找最大异或值即可。
代码:
cpp
const int N=4000;
int a[N];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int ans=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int p=a[i]^a[j];
ans=max(p,ans);
}
}
cout<<ans<<endl;
}
F. The 67 th Tree Problem
代码:
cpp
void solve()
{
int x,y;
cin>>x>>y;
if(x>y){
cout<<"NO"<<endl;
return;
}
int n=x+y;//节点数。
if(n%2==0&&x==0){
cout<<"NO"<<endl;
return;
}
if(n%2==1){
y--;
}else x--;
cout<<"YES"<<endl;
int cnt=1;
for(int i=1;i<=x;i++){
cout<<1<<" "<<++cnt<<endl;
cout<<cnt<<" "<<++cnt<<endl;
}
for(int i=1;i<=y-x;i++){
cout<<1<<" "<<++cnt<<endl;
}
}
G. The 67 th Iteration of "Counting is Fun"
思路:
首先 b 数组是第 i 个人坐下的时间。可以存下每个时间坐下的人数,进而用前缀和得到前 t 时间坐下的人数。
题目并不保证一定有解,所以考虑 0 答案。
之后就是一个模拟:
对于每个人找到他坐下的时间,这个人可以坐下一定满足至少一个邻居坐下(所以对于两端点只考虑一个人)。
此时的 a 一定要小于 t−1t-1t−1 时间坐下的人数,并大于 t−2t-2t−2 时间坐下的人数,这样可以保证他不提前或者推迟坐下。
这样 a 的范围就是 (up−down)(up-down)(up−down) 的乘积。
找到两个邻居的最早坐下时间,如果此时的时间要大于当前的 b 则这个人在现在是无法坐下的,那么无解。
代码:
cpp
const int MOD=676767677;
const int N=2e5+5;
int b[N];
int c[N];
int pre[N];
void solve()
{
int n,m;
cin>>n>>m;
memset(pre,0,sizeof pre);
memset(c,0,sizeof c);
for(int i=0;i<n;i++){
cin>>b[i];
c[b[i]]++;
}
pre[0]=c[0];
for(int i=1;i<m;i++){
pre[i]=pre[i-1]+c[i];
}
int ans=1;
for(int i=0;i<n;i++){
int t=b[i];
if(t==0)continue;
int mi=1e18;
if(i>0)mi=min(mi,b[i-1]);
if(i<n-1)mi=min(mi,b[i+1]);
if(t<=mi){
cout<<"0"<<endl;
return;
}
int u=0;
if(t>0)u=pre[t-1];
int l=1;//至少有一个邻居坐下
if(mi<t-1){//如果邻居坐下的时间小于t-1则要求下界必须是t-2坐下的人数
if(t-2>=0)l=pre[t-2]+1;
}
if(u<l){
cout<<0<<endl;
return;
}
int w=(u-l+1)%MOD;
ans=ans*w%MOD;
}
cout<<ans<<endl;
}