Codeforces 1256总结

传送门
A.Payment Without Change
水题,题目大意是有a个价值为n的硬币和b个价值为1的硬币,能否用他们组成S,直接根据题目列式子x∗n+y∗1=S,然后找到最大的不大于S的x,再判断如果xn+b 不小于 S则有答案,否则无答案即可。
B. Minimize the Permutation
给出一串数字,尽可能的让它的字典序最小,可以通过交换相邻的两个元素来使得其字典序变小,但每个固定位置只能交换一次,需要开两个数组,一个数组记录数字,一个数组记录其是否已经交换过,直到所有元素都交换过一遍,过程中尽量将较小的数字往前放就算结束。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,a[105],b[105],i,j,k,n;
int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        cin>>n;
        memset(b,0,sizeof b);
        for(i=0; i<n; i++)
            cin>>a[i];
        for(i=n-2; i>=0; i--)
            for(j=i; j<n-1; j++)
                if(a[j]>a[j+1] && (!b[j]))
                {
                    swap(a[j],a[j+1]);
                    b[j]=1;
                }
        for(i=0; i<n; i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }
}

C. Platforms Jumping
大致题意:
你需要跨过一条小河,长度为n,现在共有m个板子,并告诉你m个板子的长度,你跳跃的长度为d,求能否越过小河。如果可以,应如何摆放板子。
思路步骤:
这又是一个贪心题
如果板子比较少的话,通过贪心的思路可以把板子往后放;若木板可以满足过河,就考虑保证所有木板都有空间放的情况下尽量往后放;若木板数量和剩余的空间数一样的话就直接挨着铺。
D. Binary String Minimizing
大意就是给你一个数k,让你通过k布,将给出的二进制字符串尽可能地使其字典序变小,问变换后最小字典序是什么样的。
虽然这是D题,但是真的水,做题地时候因为网不好,出现乱码导致看不清数据范围,第一次RE,扩大数组范围就ac了,思路就是其实就是把0尽可能地提到前边去,没啥难度。
E. Yet Another Division Into Teams
题意:给你n个数,你需要把这n个数分组,每组至少有三个数,求如何分组才能使分组之后各组的极差之和最小。
这个题是一道DP题,其实我还挺喜欢做dp题的,觉得非常有挑战性,但是这个题我愣是想了一早上没想出来,尝试过一个一个分配最后还是一堆bug。看了下题解,首先排序这个就不用说了,一个队最少有3人,那么最多有5人,因为如果有6人的话就可以组成两个队,使最小多样性降低,这个是我上午没想到的一个点。
最初dp[0]=0;
其他值都为inf。
然后通过以下三个状态转移方程来解决问题:
dp[i+3]=min(dp[i+3],dp[i]+a[i+2]−a[i]);
dp[i+4]=min(dp[i+4],dp[i]+a[i+3]−a[i]);
dp[i+5]=min(dp[i+5],dp[i]+a[i+4]−a[i]).
附一下大佬的博客
F. Equalizing Two Strings
大致题意:给出两个等长的字符串 s 和 t ,每次可以选择一个固定的长度len,并在 s 和 t 中分别逆置一个长度为 len的子串,问是否可以使 s 和 t 经过若干次操作之后相等。
首先这个题给出的两个字符串中每种字符的种类和数量都必须是相等的,刚开始我想着只要满足这一点就可以输出yes,忽略了没有两个相同的字母时,可以将两个串看成两个排列,若两个串的逆序对奇偶性相同则有解,否则无解
因为一个串到达升序之后,在进行两次原地交换,另外一个串就能多两次交换
所以奇偶性相同就一定有解。如果里边某一字符出现过两次及以上,那就一定yes,就是可以把其中一个串的这两个字符不断交换,另一个字符串随意变换即可。所以其实这个题也不难,也是应该可以做出来的。
总结来讲今天的这六个题都不难,不应该只做出来了两个,主要是dp的题浪费了我大把时间,没有分配好时间,网的问题还导致RE了一次,而且二十多分钟才出了第一个题,也是有点慢,争取明天能出三个题吧。

猜你喜欢

转载自blog.csdn.net/weixin_46434074/article/details/107200759