群赛7总结----2017.9.9

本文解析了五道编程题,包括把一个数分解为指数和、寻找平行四边形的第四个顶点、通过发言机制淘汰对手、将数值分解为最少的3的幂次之和以及模拟棋盘上点的移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

T1 Bachgold Problem

题意:

把一个数分成尽量多的指数和.

解法:

暴力.

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a;
    cin>>a;
    if(a%2==0)
    {
        cout<<a/2<<endl;
        for(int i=1;i<=a/2;i++)
        cout<<2<<" ";
    }
    else
    {
        cout<<a/2<<endl;
        for(int i=1;i<=a/2-1;i++)
        cout<<2<<" ";
        cout<<3;
    }
    return 0;
}

网址:这一题

小结:

**此类题目水题。**

T2 Parallelogram is Back

题意:

给你三个点的坐标,找出第四个点,使其构成一个平行四边形.

解法:

暴力直接输出.

代码:

#include<bits/stdc++.h>
using namespace std;
#define N 4
int x[N][2],y[N][2];
int main()
{
    for(int i=1; i<=3; i++)
        cin>>x[i][1]>>x[i][2];
    cout<<3<<endl;
    cout<<x[1][1]-x[2][1]+x[3][1]<<" "<<x[1][2]-x[2][2]+x[3][2]<<endl;
    cout<<x[2][1]-x[3][1]+x[1][1]<<" "<<x[2][2]-x[3][2]+x[1][2]<<endl;
    cout<<x[3][1]-x[1][1]+x[2][1]<<" "<<x[3][2]-x[1][2]+x[2][2]<<endl;
    return 0;
}

网址:这一题

小结:

**此类题目特水。**

T3 Voting

题意:

输入一串字符串,由R和D构成.每个字符代表两方中的一员,每个人轮流发言,可以让另一方的人禁言.问最后留下来的一方输出.

解法:

巧用队列.

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 300001;
int c[N];
int main()
{
    int n,k;
    cin >>n>>k;
    for(int i=1; i<=n; i++)
    {
        cin>>c[i];
    }
    priority_queue < pair<int,int> > q;
    ll sum=0;
    for(int i=1; i<=n+k; i++)
    {
        if(i<=n)
        {
            q.push(make_pair(c[i],i));
        }
        if(i>k)
        {
            ll nn = q.top().first;
            ll mm = q.top().second;
            q.pop();
            sum+= (ll)nn * (ll)(i-mm);
            c[mm]=i;
        }
    }
    cout << sum << '\n';
    for(int i=1; i<=n; i++)
    {
        cout << c[i] << ' ';
    }
    cout << '\n';
}

网址:这一题

小结:

**此类题目充分利用队列的原理。**

T4 Secrets

题意:

把一个数分成尽量少的3的幂次方的和,并且差最小.

解法:

暴力.

代码:

#include<bits/stdc++.h>
using namespace std;
#define N 200000
int main()
{
    long long a,b=3,c=1,d=0;
    cin>>a;
    if(a%3!=0)
        d=a/3+1;
    else
    {
//      cout<<66;
        c=3*3;
        while(a!=0)
        {
//          cout<<c;
            if(c==a)
            {
                d=1;
                break;
            }
            if(a%c!=0)
            {
                d=a/c+1;
                break;
            }
            else
                c*=3;
        }
    }
    cout<<d;
    return 0;
}

网址:这一题

小结:

**此类题目可以先手算找规律。**

T5 Chips

题意:

在一个n*n的方格的变上有很多点(不在角上),方格上有很多点不能走,每个点要到对面,问有几个可以做到.

解法:

暴力模拟.

代码:

#include<bits/stdc++.h>
using namespace std;
#define N 1003
int y[N][N];
int main()
{
    int a,b,c1,c2,d=0,r1=0,r2=0;
    cin>>a>>b;
    for(int i=1; i<=b; i++)
    {
        cin>>c1>>c2;
        y[c1][c2]=1;
        if(c1>1&&c1<a)
            y[1][c2]=1;
        if(c2>1&&c2<a)
            y[c1][1]=1;
    }
//  cout<<a;
    for(int i=2; i<a; i++)
    {
        if(!y[1][i]&&!y[a][i])
        {
            d++;
            if(i==a/2+1)
                r1=1;
        }
        if(!y[i][1]&&!y[i][a])
        {
            d++;
            if(i==a/2+1)
                r2=1;
        }
    }
    if(a%2!=0&&r1==1&&r2==1)
        d--;
    cout<<d;
    return 0;
}

网址:这一题

小结:

**此类题目可以先手算找规律。**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值