羣賽7總結----2017.9.9

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;
}

網址:這一題

小結:

**此類題目可以先手算找規律。**
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章