【CQ18阶梯赛第一场】题解

【A-风格不统一如何写程序】

输入字符串,得到长度,对于每个字符:如果是大写,则改为:‘_’+小写;如果是‘_’则忽略‘_’,并且把后面的小写改为大写。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
char c[110];
int main()
{
    int N,len,i;
    scanf("%d",&N);
    while(N--){
        scanf("%s",c+1);
        len=strlen(c+1);
        for(i=1;i<=len;i++){
            if(c[i]==‘_‘) {
                i++;
                c[i]=toupper(c[i]);
            }
            else if(c[i]>=‘A‘&&c[i]<=‘Z‘){
                printf("_");
                c[i]=tolower(c[i]);
            }
            printf("%c",c[i]);
        }
        printf("\n");
    } return 0;
}

【B-歌德巴赫猜想】

两种解法:

一:先把素数筛选出来,然后试探即可。筛选素数一般是埃氏筛法和欧式筛(不会的请自学)。

二:枚举p,q=n-p,然后判断p,q是否是素数。判断一个数X是否是素数的方式是枚举2-sqrt(X),是否能被X整除。

代码是第一种解法的欧氏筛。

#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1000000;
int p[maxn+10],vis[maxn+10],cnt,N;
void solve()
{
    for(int i=2;i<=N;i++){
        if(!vis[i]) p[++cnt]=i;
        for(int j=1;j<=cnt&&i*p[j]<=N;j++){
            vis[i*p[j]]=1;
            if(i%p[j]==0) break;
        }
    }
}
int main()
{
    scanf("%d",&N);solve();
    for(int i=1;i<=cnt;i++){
        if(!vis[N-p[i]]) {
            printf("%d %d\n",p[i],N-p[i]);
            return 0;
        }
    }
}

【C-数组重排2】

显然,题意是要找最大上升子序列长度X,答案就是N-X,所以倒序检验是否是连续下降的,是则X++。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<memory>
#include<cstring>
using namespace std;
int a[100010],ans,now;
int main()
{
    int i,j,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++) scanf("%d",&a[i]);
    now=n;
    for(i=n;i>=1;i--){
        if(a[i]==now){
            ans++;
            now--;
        }
    }
    printf("%d\n",n-ans);
    return 0;
}

【D-方格取数】

基础DP(动态规划),为了让两人路径不相交,我们使二人一起走,第一位从(2,1)出发,第二位从(1,2)出发,(保证第一位在第二位的下面,即i>j)在走X步的情况下,第一位走到(i,X-i),第二位走到(j,X-j),用dp[X][i][j]表示二人分别走到(i,X-i) (j,X-j)的最大值。

第一位可能从上面或者左边来,第二位同理。那么X的来源有(i,X-i-1)+(j,X-j-1);(i,X-i-1)+(j-1,X-j);   (i-1,X-i)+(j,X-j-1) ;   (i-1,X-i-1)+(j-1,X-j);分别取最优解即可。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[410][210][210],a[210][210];
int main()
{
    int n,i,k,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
     for(j=1;j<=n;j++)
      scanf("%d",&a[i][j]);
    dp[3][2][1]=a[1][1]+a[1][1]+a[2][1]+a[1][2];
    for(i=4;i<=n+n-1;i++)
        for(j=1;j<=n;j++)
         for(k=1;k<=j-1;k++){
          dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k-1]);
          dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]);
          dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][k]);
          dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][k-1]);
          dp[i][j][k]+=a[j][i-j]+a[k][i-k];
    }
    printf("%d\n",dp[n+n-1][n][n-1]+a[n][n]+a[n][n]);
    return 0;
}

原文地址:https://www.cnblogs.com/hua-dong/p/8458310.html

时间: 2024-07-29 16:23:55

【CQ18阶梯赛第一场】题解的相关文章

Dream_Chaser队训练赛第一场 I题

Dream_Chaser队训练赛第一场 I题 题目来自2012成都区域赛 I - Count Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4472 Description Prof. Tigris is the head of an archaeological team who is currently in charge of a

早晨训练赛第一场 B题 哈希

早晨训练赛第一场 B题 B - Trees in a Row Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 402B Description The Queen of England has n trees growing in a row in her garden. At that, the i-th (1 ≤ i 

HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可以工作的最长时间和一个可以完成的任务的难度的最大值, 一台机器能完成一个任务的条件是这台机器的最长工作时间和能完成任务的难度值必须都大于等于这个任务,而且一台机器最多完成一个任务,假设一个任务的时间为t,难度值为x,那么完成这个任务可以赚到的钱 money = 500 * t + 2 * x; 现在

WC2019 全国模拟赛第一场 T1 题解

由于只会T1,没法写游记,只好来写题解了... 题目链接 题目大意 给你一个数列,每次可以任取两个不相交的区间,取一次的贡献是这两个区间里所有数的最小值,求所有取法的贡献和,对 \(10^9+7\) 取模. 数列长度 \(2\times 10^5\) ,值域 \(1\) ~ \(10^9\) . \(O(n^4)\) 做法 预处理区间最小值,枚举选的两个区间. #include <iostream> #include <cstdio> #include <algorithm&

编程之美2015初赛第一场 题解

[A题] 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, -, n.树中有n - 1条边,任意两个节点间恰好有一条路径.这是一棵彩色的树,每个节点恰好可以染一种颜色.初始时,所有节点的颜色都为0.现在需要实现两种操作: 1. 改变节点x的颜色为y: 2. 询问整棵树被划分成了多少棵颜色相同的子树.即每棵子树内的节点颜色都相同,而相邻子树的颜色不同. 输入 第一行一个整数T,表示数据组数,以下是T组数据. 每组数据第

计蒜之道 初赛 第一场 题解

搜狗输入法的分词算法 搜狗输入法最近的用户输入中出现了一种新的输入模式,形如 "0k1234567",搜狗的工程师发现这一模式后了解到,这是一种新被提出的对于十五进制数字的标记模式,其中 "0k" 是标记进制为15的前缀标记,之后的部分 "1234567" 是实际的十五进制的数字串. 在发现这一标记模式后,搜狗的工程师开始尝试在已有的分词算法上进一步加入对于十五进制数字串的处理,把网页上的这种形式的 15 进制数正确地提取出来.我们知道,标记十五

2015 多校赛 第一场 1007 (hdu 5294)

总算今天静下心来学算法.. Description Innocent Wu follows Dumb Zhang into a ancient tomb. Innocent Wu’s at the entrance of the tomb while Dumb Zhang’s at the end of it. The tomb is made up of many chambers, the total number is N. And there are M channels connect

2014 多校赛 第一场

题目链接 A - Couple doubi 题意:桌上共有 k 个球,第i个球的值为 (1^i+2^i+...+(p-1)^i )mod p DouBiXp 和 他的女朋友 DouBiNan 轮流拿球,DouBiNan先拿, 所有的球都拿完后,谁手上球的值总和更大谁就赢, 已知 k,p,且p为素数, 若DouBiNan赢输出"YES",否则输出"NO" 分析:DouBiNan先拿,为了赢肯定先拿没有被拿的球中值最大的, 找规律得 每个球的值要么为 0,要么为某个的正

我的第一场比赛——金马五校赛

这场比赛在东华大学举办,基于我上次普及组初赛没有过(本人过于蒟蒻),这算是我的第一场正式线下比赛. 我们学校信息组总共有九个人报名参加,我是其中第八名,但是在整场比赛中大约五五开. 以下是我的比赛心得: 这次比赛是在是发挥失常了.热身赛的时候排名还不错,三十几名,但是到了正式比赛就不行了.这场考试共十二道题目只做出2道. 第一题应该是很水的,但是我少考虑了一个条件,查了将近两个小时后才发现错误. 第二道和最后一道题目都可以用暴力做,但是也不知道为什么就是不让我过. 第六道题目是做的最快的题目,用