首页 > 其他分享 >【牛客周赛 Round 10】A-D题解

【牛客周赛 Round 10】A-D题解

时间:2023-09-03 22:11:33浏览次数:49  
标签:10 frac int 题解 long 牛客 len ans Round

A

https://ac.nowcoder.com/acm/contest/64272/A

题意

游游定义一个数组为“稳定的”,当且仅当数组相邻的两个元素之差的绝对值不超过1。例如[2,3,2,2,1]是稳定的,而[1,3,2]则不是稳定的。
游游拿到了一个数组,她想求出该数组的最长的“稳定的”连续子数组的长度。

题解

首先,如果在某处不稳定了(即两相邻元素之差大于1),那么后面的稳定数组肯定不能用上这一段,它们被不稳定的一对元素隔开了

边输入边判断,设一个变量len,表示当前的最长稳定数组。如果满足数组相邻的两个元素之差的绝对值不超过1,就令len++,否则看len能不能更新ans,再令len=1

code

#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;
const int N = 1e5 + 10;
int t, n;
int a[N];

int main() {  
    ios::sync_with_stdio(false);
    cin >> n;
    int len = 0, ans = 0;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        if(!len) len = 1;
        else {
            if(abs(a[i] - a[i - 1]) > 1) ans = max(ans, len), len = 1;
            else len++;
        }
    }
    ans = max(ans, len);
    cout << ans << endl;
    return 0;
}

B

https://ac.nowcoder.com/acm/contest/64272/B

题意

游游定义一个字符串是“好串”,当且仅当该字符串相邻的字符不相等。例如"arcaea"是好串,而"food"不是好串。

游游拿到了一个字符串,她可以将该字符串的各个字符顺序随意打乱。她想知道一共可以生产多少种不同的好串?

注意,输入的串长度不超过10.

题解

看到长度不超过10,由 \(10! = 3628800\),我们可以枚举每个串,如果它是一个好串,ans += 1

code

#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;
const int N = 500 + 10;
int t, n;
char s[12];
int a[12];
int f[12];

int main() {  
    scanf("%s", s + 1); n = strlen(s + 1);
    f[0] = 1;
    for(int i = 1; i <= n; i++) a[i] = i, f[i] = f[i - 1] * i;
    int ans = 0; bool ff = 0;
    do {
        ff = 1;
        for(int i = 1; i < n; i++) {
            if(s[a[i]] == s[a[i + 1]]) {
                ff = 0;
                break;
            }
        }
        if(ff == 1) ans++;
    }while(next_permutation(a + 1, a + n + 1));
    sort(s + 1, s + n + 1);
    t = 0;
    for(int i = 1; i <= n; i++) {
        if(i == 1 || s[i] == s[i - 1]) t++;
        else ans /= f[t], t = 1;
    }
    ans /= f[t];
    printf("%d\n", ans);
    return 0;
}

C

https://ac.nowcoder.com/acm/contest/64272/C

题意

游游准备开车出游,她的车非常特殊,油越多则最高速度越快,即最高速度和油量是成正比的。另外,行驶过程中油是不会消耗的。

车初速度 \(v_0\),如果花 \(t\) 时间加油,那么车速变成 \(v_0 + x * t\)

问最快什么时候能到达距离为 \(y\) 的地方

题解

注意,题目虽然说油越多速度越快,但是加油过程中车是静止的

假设花 \(t\) 时间加油,那么最终所花的时间为 \(t + \frac{y}{t * x + v_0}\),把它写成 \(t + \frac{v_0}{x} + \frac{\frac{y}{x}}{t + \frac{v_0}{x}} - \frac{v_0}{x}\),

由均值不等式知,上式最小值为 \(2*sqrt(\frac{y}{x}) - \frac{v0}{x}\),等号当且仅当 \(t + \frac{v_0}{x} == sqrt(\frac{y}{x})\) 时取得。

所以:如果 \(sqrt(\frac{y}{x}) - \frac{v_0}{x} \geq 0\) (即 \(t \geq 0\) 时),ans = \(2*sqrt(\frac{y}{x}) - \frac{v0}{x}\)

否则 ans = \(y / v0\) (实际看来就是还不如不加油更快)

本题只得了75%的分数,就是因为忽视了均值不等式成立的条件!!!

code

#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;
const int N = 500 + 10;
ll v0, x, y;

int main() {  
    cin >> v0 >> x >> y;
    double ans = 0;
    double tem = sqrt(1.0 * y / x) - 1.0 * v0 / x;
    if(tem >= 0) ans = 2.0 * sqrt(1.0 * y / x) - 1.0 * v0 / x;
    else ans = 1.0 * y / v0;
    printf("%.10f\n", ans);
    return 0;
}

D

https://ac.nowcoder.com/acm/contest/64272/D

题意

游游拿到了一个01串,该字符串仅由'0'和'1'两种字符组成,且第一个字符保证是'1'。
由于该字符串过长,游游用一个大小为n的数组表示该字符串:
第一个元素a_1 表示字符串开头有a_1 个'1'字符,第二个元素a_2 表示接着有a_2 个'0'字符,以此类推表示整个字符串。游游想知道,该01串共有多少个非空回文子串?由于答案可能过大,请对 \(10^9+7\) 取模。

思路

把答案分成两部分。

第一部分,一整串0或1。手推一下可知,\(a_i\) 对答案的贡献是 \(a_i * (a_i + 1) / 2\)。

第二部分,对于一整串0或1,若回文串包含除了它之外的部分,那么回文串的中心必然位于这个串的最中心,然后往外延伸。

假设采取一串1作为中心的串,它两边为0串,如果这两个0串不一样长,那么它们对答案的贡献是那个较短的串的长度;如果一样,那么就把串长都加给答案,然后再往外看两个串

code

#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;
const int N = 1000 + 10, mod = 1e9 + 7;
int n, a[N];
ll ans = 0;

int main() {  
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        ans += 1ll * a[i] * (a[i] + 1) / 2;

 /* 
        我改正的赛时wa掉的写法!!!忽略了(a[i] / 2)应该被括号括起来这件事,把乘2和2这个分子约掉了!!(比如a[i] == 3,本来要乘1*2,就会变成*3!!!)
        ans += 2ll * (1 + a[i] / 2) * (a[i] / 2);
        if(a[i] % 2) ans += a[i] / 2 + 1;
        else ans -= a[i] / 2;
        if(ans < 0) ans += mod;
*/

        ans %= mod;
    }
    ans %= mod;
    for(int i = 2; i < n; i++) {
        int st = i - 1, en = i + 1; 
        while(st >= 1 && en <= n) {
            ans += 1ll * min(a[st], a[en]);
            ans %= mod;
            if(a[st] != a[en]) break;
            else st--, en++;
        }
    }
    cout << ans << endl;
    return 0;
}

标签:10,frac,int,题解,long,牛客,len,ans,Round
From: https://www.cnblogs.com/re0acm/p/17675695.html

相关文章

  • CF786c分块题解
    CF786c分块题解思路:首先思考一下如果直接硬着头皮做会怎么样?对于每一个k,我都要遍历一遍数组贪心求解ans,导致n方时间复杂度要发现一下性质:答案最多为ceil(n/k)。随着k的增加,答案单调不增。随着k的增加,答案越不容易改变(连续相同的答案越多)。由1可知,总共的答案数量大概......
  • 8.30 模拟赛 光和影(dream) 题解
    概括:大分类讨论。首先有个重要结论,无论是三种操作中的哪一种,他的左儿子仍然在他的左子树内,右儿子在右子树内。同时,旋转一个点一次,对他更上面的点的深度没有影响。以此,我们预处理出一个\(up_{u,0/1}\)表示将\(u\)splay到根上,对左子树和右子树深度的影响,由于上面的结论,这个东......
  • CF838D Airplane Arrangements 题解
    题意一架飞机有\(n\)个座位排成一列,有\(m\)名乘客(\(m\leqn\))依次上飞机。乘客会选择一个目标座位(两人可以选同一个目标座位),然后选择从前门或者后门上飞机,上飞机后,他们会走到自己的目标座位,如果目标座位已经有人坐了,他们会继续往前走,在走到第一个空位后坐下。如果走到最后......
  • 【题解】P2900 [USACO08MAR] Land Acquisition G
    题目链接:P2900[USACO08MAR]LandAcquisitionG我们通过题目可以得出一个较为清晰的结论:我们将所有的矩形排列起来,可以发现最后被完全包含在另一个矩形内的矩形是没有意义的。这样的话我们得到的所有矩形的并是呈阶梯状的,如下图:其中,中间的浅蓝色的边是没有意义的然后我......
  • [ABC318G] Typical Path Problem 题解
    题意给定一个\(N\)个节点和\(M\)条边组成的简单无向联通图,给定三个节点\(A,B,C\),求是否存在一条简单路径满足\(A\rightarrowB\rightarrowC\)。(\(3\leN,M\le2\times10^5\))。题解因为简单路径要求每个节点至多经过一次,故不存在合法的简单路径当且仅当存在一个......
  • 【动态规划】“新手动态规划合集”题解
    动态规划三要素阶段,状态,决策动态规划经典模型LIS(最长上升子序列)给定长度为\(N\)的序列\(A[i]\),求出其最长上升子序列的长度。(以不严格上升为例)阶段:已经处理的序列长度\(i\)状态:\(f[i]\)表示以\(A[i]\)结尾的LIS长度转移\[f[i]=\max\limits_{j\in\left[1,......
  • [ABC318D] General Weighted Max Matching 题解
    [ABC318D]GeneralWeightedMaxMatching题解题意  给定无向有权完全图,求最大权匹配。思路分析  注意到\(n\le16\),我考虑状压DP。  设当前点集\(S\)中最大权匹配的答案是\(f_S\),我们考虑\(S\)中“最后”一个点\(p\)(这里的“最后”一个点是指,在状压表示状态......
  • [ABC318E] Sandwiches 题解
    题意给定一个长度为\(N\)的正整数列\(A=\left(A_1,A_2,\cdots,A_N\right)\),求满足以下条件的正整数三元组\(\left(i,j,k\right)\)的数量:\(1\lei<j<k\leN\);\(A_i=A_k\);\(A_i\neqA_j\)。数据范围:\(3\leN\le3\times10^5\);\(1\leA_i......
  • CF1848B Vika and the Bridge 题解
    CF1848BVikaandtheBridge题解题目大意给个题目传送门吧,感觉题意已经很清楚了题目传送门分析(我不会告诉你我第一眼看过去是二分)因为我们只能改一块木板的颜色,所以可以考虑贪心。大概算了下复杂度,也没有问题。题解我们要去求每种颜色最大距离的最小值,那我们可以先去求......
  • Pinely Round 2 (Div. 1 + Div. 2)
    Channel简单分类讨论情况即可 算下最多有多少人在线即可voidsolve(){intn,a,q;cin>>n>>a>>q;intadd=0,minn=0,maxx=0;cin>>in+1;for(inti=1;i<=q;i++){if(in[i]=='+')......