Educational Codeforces Round 141 (Rated for Div. 2) A~C

Educational Codeforces Round 141 (Rated for Div. 2)
比赛链接:https://codeforces.com/contest/1783

A. Make it Beautiful

题目大意:对数组a进行排序,使满足∀i,a[i] != s[i - 1],(1 <= i <= n)

思路:全部元素相同则无解,否则进行逆序排列,若第一个与第二个相等,则将第二个与最后一个进行交换

void solve()
{
    cin >> n;
    for(int i = 1; i <= n; i ++ )
        cin >> a[i];

    sort(a + 1,  a + n + 1);
    
    if(a[1] == a[n]) cout << "NO" << endl;
    else
    {
        cout << "YES" << endl;
        if(a[n] == a[n - 1]) swap(a[n - 1], a[1]);
            for(int i = n; i >= 1; i -- )
                cout << a[i] << " ";
        cout << endl;
    }
}

B. Matrix of Differences

题目大意:给定一个矩阵,定义一个集合包含相邻的两个元素相减的绝对值,将1~n放入矩阵中,使得集合去重后中的包含的元素最多
思路:按照1,n²-1,2, n²-2,3,n²-3,4…的顺序排列下去可以保证凑出1~n²-1,横(竖)顺序填入即可

void dfs(int i, int j, int flag)
{
    if(flag) a[i][j] = x ++ ;
    else a[i][j] = y -- ;
    
    for(int d = 0; d < 4; d ++ )
    {
        int ax = i + dx[d];
        int ay = j + dy[d];
        if(ax < 1 || ax > n || ay < 1 || ay > n || a[ax][ay]) continue;
        dfs(ax, ay, !flag);
        break;
    }
}

void solve()
{
    memset(a, 0, sizeof a);
    cin >> n;
    
    x = 1, y = n * n;
    dfs(1, 1, 1);
    
    for(int i = 1; i <= n; i ++ )
    {
        for(int j = 1; j <= n; j ++ )
            cout << a[i][j] << " ";
        cout << endl;
    }
 
    for(auto it : p) cout << it << endl;
}

C. Yet Another Tournament

题目大意:给定1~n个对手,m分钟的时间,击败一个对手需要v[i]分钟,否则会被击败, 1~n个对手两两之间比赛一次,i>j时i获胜,按照击败人数排序,求最高名次
思路:击杀x人时,未击杀第x+1名对手则排名为n + 1 - x,否则排名为n - x,考虑在击杀最多的情况下尽量击杀第x+1名对手

void solve()
{
    memset(st, 0, sizeof st);
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i ++ )
    {
        scanf("%d", &v[i]);
        a[i] = {v[i], i};
    }

    sort(a + 1, a + n + 1);

    int ans = 0, max_v = 0;
    for(int i = 1; i <= n; i ++ )
        if(m - a[i].x >= 0)
        {
            ans ++ ;
            m -= a[i].x;
            max_v = max(max_v, a[i].x);
            st[a[i].i] = 1;
        }

    if(ans != n)
    {
    	if(st[ans + 1]) ans ++ ;
        else if(m + max_v - v[ans + 1] >= 0) ans ++ ;
	}
	
    printf("%d\n", n + 1 - ans);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值