2018 秦皇岛CCPC-Wannafly Winter Camp Day3 Div2 题解

A:二十四点*

别问我怎么知道是891,正确做法回头补上。

#include
#include
using namespace std;
int main(){
    int n;
    scanf("%d",&n);
    if(n==6)printf("32\n");
    else{
        printf("891\n");
    }

}

F:小清新数论*

待更新……

G:排列

签到题,可以推出来A(p)数组,然后将每个第一个递减的数填上,如3 3 2 2 1, 先将3 0 2 0 1 填上,然后将4,5依次填上圈里,大家应该都明白,就不多说了。

#include 
#include
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 100005;
int m[N], a[N], b[N];
typedef long long ll;

int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &m[i]);
    a[n + 1] = 0;
    for(int i = 0; i < n; ++i)
    {
        if(m[i + 1] == n - i)
            a[n - i] = a[n - i + 1] + 1;
        else
        {
            int t = 0;
            for(int j = m[i + 1]; j <= n - i; ++j)
            {
                a[j] = a[n - i + 1] + 1;
                ++t;
            }
            i += t - 1;
        }
    }
    b[1] = a[1];
    int temp = b[1];
    for(int i = 2; i <= n; ++i)
    {
        if(a[i] < temp)
        {
            b[i] = a[i];
            temp = b[i];
        }
    }
    temp = b[1];
    for(int i = 2; i <= n; ++i)
    {
        if(!b[i])
        {
            b[i] = ++temp;
        }
    }
    for(int i = 1; i <= n; ++i)
        cout << b[i] << " ";
    return 0;
}

 

你可能感兴趣的:(2018 秦皇岛CCPC-Wannafly Winter Camp Day3 Div2 题解)