Codeforces Round 1090 (Div. 4)

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;
}
相关推荐
csdn_aspnet10 小时前
C语言 Lomuto分区算法(Lomuto Partition Algorithm)
c语言·开发语言·算法
谙弆悕博士10 小时前
【附C源码】从零实现C语言堆数据结构:原理、实现与应用
c语言·数据结构·算法··数据结构与算法
C+++Python12 小时前
C++ 进阶学习完整指南
java·c++·学习
sparEE12 小时前
c++值类别、右值引用和移动语义
开发语言·c++
jrrz082813 小时前
Apollo MPC Controller
c++·自动驾驶·apollo·mpc·横向控制·lateral control
gaosushexiangji13 小时前
DIC系统推荐:基于千眼狼三维数字图像相关的无人机旋翼疲劳试验全场应变与位移测量
人工智能·算法
小王C语言15 小时前
【线程概念与控制】:线程封装
jvm·c++·算法
学习,学习,在学习15 小时前
Qt工控仪器程序框架设计详解(工控多仪器控制版本)
开发语言·c++·qt
kyle~15 小时前
工程数学---点云配准卡布施(Kabsch)算法(求解最优旋转矩阵)
线性代数·算法·矩阵
张二娃同学15 小时前
03_变量常量与输入输出_printf与scanf详解
算法