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;
}
相关推荐
小菜鸡桃蛋狗2 小时前
C++——string(上)
开发语言·c++
wljy12 小时前
第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(个人见解,已完结)
c语言·c++·算法·蓝桥杯·stl
清空mega3 小时前
C++中关于数学的一些语法回忆(2)
开发语言·c++·算法
想唱rap3 小时前
线程池以及读写问题
服务器·数据库·c++·mysql·ubuntu
香蕉鼠片3 小时前
数据结构八股(一)
数据结构·算法
Mr_Xuhhh3 小时前
从理论到实践:深入理解算法的时间与空间复杂度
java·开发语言·算法
望眼欲穿的程序猿3 小时前
Vscode Clangd 无法索引 C++17 或者以上标准
java·c++·vscode
6Hzlia4 小时前
【Hot 100 刷题计划】 LeetCode 42. 接雨水 | C++ 动态规划与双指针题解
c++·算法·leetcode
地平线开发者4 小时前
智能驾驶感知算法的演进
算法·自动驾驶