周一训练赛题解

这次完全是水题大集合啊,希望大家A的开心;

前两个题是我找的,后两个是陶叔找的,另外因为我的偷懒,下面所有的代码都是陶叔亲自写的,十分感谢陶叔;

陶叔暑假为了大家的集训,牺牲了很多自己宝贵的时间,大家接下来要好好训练啊!!!!

废话少说,进入正题:

Problem A      SPOJ QUEST5

签到题:

将所有的边按照右端点排个序,然后每次选择没有钉住的点,然后把这之后的所有与它相交的边全去掉;

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10100;
struct Table{
    int l,r;
    bool operator < (const Table &rhs) const{
        return r < rhs.r;
    }
}table[maxn];

int main(){
    int kase,n;
    scanf("%d",&kase);
    while(kase--){
        scanf("%d",&n);
        for(int i = 0;i < n;i++){
            scanf("%d%d",&table[i].l,&table[i].r);
        }
        sort(table,table+n);
        int ans = 0,r = -1;
        for(int i = 0;i < n;i++){
            if(r < table[i].l){
                ans++;
                r = table[i].r;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

Problem B      SPOJ FAVDICE

数学题,也是给大家YY的题,不会只能怪高中老师了~~~

从已经出现i面变成已经出现i+1面的期望投掷次数是N/(N-i)。

代码:

#include <cstdio>
int main(){
    int kase,n;
    scanf("%d",&kase);
    while(kase--){
        scanf("%d",&n);
        double ans = 0;
        for(int i = 1;i <= n;i++)   ans += (n+0.0)/(i+0.0);
        printf("%.2f\n",ans);
    }
    return 0;
}

Problem C      SPOJ GNYR09F

dp题,dp可能刚刚开始对大家来说比较难,但是静下心来分析还是比较简单的;

dp(i ,j ,k)表示前i个数中,当前累积和为j,末尾数字为k的方案数。

考虑第i个位置的2种情况:

1.放0:dp(i,j,0) = dp(i-1,j,0) + dp(i-1,j,1)

2.放1:dp(i,j,1) = dp(i-1,j,0)

如果还有j>=1,dp(i,j,1) += dp(i-1,j-1,1)

#include <cstdio>
#include <cstring>
int dp[101][101][2];
int main(){
    int kase,hehe,n,k;
    scanf("%d",&kase);
    while(kase--){
        scanf("%d%d%d",&hehe,&n,&k);
        for(int i = 0;i <= k;i++)   dp[1][i][0] = dp[1][i][1] = 0;
        dp[1][0][0] = dp[1][0][1] = 1;
        for(int i = 2;i <= n;i++){
            for(int j = 0;j <= k;j++){
                dp[i][j][0] = dp[i-1][j][0]+dp[i-1][j][1];
                dp[i][j][1] = dp[i-1][j][0];
                if(k >= 1)  dp[i][j][1] += dp[i-1][j-1][1];
            }
        }
        printf("%d %d\n",hehe,dp[n][k][0]+dp[n][k][1]);
    }
    return 0;
}

Problem D      SPOJ VENOM

二分题,如果有人把它当做暴力题来做,而且执迷不悟,那么欢迎前来和聪哥组队去跑马拉松了~~~

直接二分英雄死亡的时间,然后计算判断即可~~~

代码:

#include <cstdio>
typedef long long LL;
int H,P,A;
bool judge(int n){
    LL ans = (LL)(n+1)*n/2*P-(LL)(n-1)*A-H;
    if(ans >= 0) return 1;
    return 0;
}

int main(){
    int kase;
    scanf("%d",&kase);
    while(kase--){
        scanf("%d%d%d",&H,&P,&A);
        int l = 1,r = 1000000,ans = l;
        while(l <= r){
            int mid = (l+r)>>1;
            if(judge(mid))  r = mid-1,ans = mid;
            else    l = mid+1;
        }
        printf("%d\n",ans*2-1);
    }
    return 0;
}

周一训练赛题解

时间: 2024-10-07 01:27:36

周一训练赛题解的相关文章

cumt训练赛题解

2017年4月3日 cumt2017春季--训练赛(1) A.HihoCoder 1339 (dp) 思路: 比较清晰呢,就是个dp吧.定义一下状态,dp[i][j]:前i个骰子,扔出点数和为j的方案数.然后不就很好写了嘛递推式,dp[i][j] = dp[i - 1][j - k](1<=k<=6). 好像题就做完了诶,可是窝wa了两发什么鬼.第一发爆int,第二发爆longlong,这里的trick就是方案数可能非常大,所以这题的应该把状态定义为dp[i][j]:前i个骰子,扔出点数和为j

训练赛题解

突然想到好久以前做完这份题目没写题解.蛮来写写吧.很多细节已经忘记了.. 第一题 很简单的字符串比对是否b包含a.不包含就报NO,包含就YES..坑爹的第一次!!.把strlen放在了for循环里面..就超时了..超时了.. 注意:for里面的条件每次也会重新计算. A - All in All Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice P

第三周训练赛题解

这次题目加强了搜索的练习,还有一些小技巧和基本方法,加了一道基础DP居然没人A确实是意料之外,C题的裸DFS也是很迷.蓝桥杯以爆搜为主,近期会加强搜索训练,做好准备. A: 给定一个整数n,将1~n排列成环使两两之间互质. DFS搜索所有可能的排列,输出. B: 问能否在恰好的时间从S->D 题目运用到了奇偶剪枝的方法, 根据题目,doggie必须在第t秒到达门口.也就是需要走t-1步.设doggie开始的位置为(sx,sy),目标位置为(ex,ey).如果abs(ex-x)+abs(ey-y)

2018.12.2 中国石油大学第一次新生训练赛题解

整理人: 周翔 A题:李继朋 B题:李继朋 H题:魏斯博 原文地址:https://www.cnblogs.com/QLU-ACM/p/10057831.html

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&amp;#39;s problem(manacher+二分/枚举)

pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法.求出以第i个点为中心的回文串长度.记录到数组p中 要满足题目所要求的内容.须要使得两个相邻的回文串,共享中间的一部分,也就是说.左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也

CSU-ACM暑假集训基础组训练赛(4)解题报告

•Problem A SPOJ SUB_PROB   AC自动机 •题意: 给定一个长为M(M≤100000 )的文本串,和N(N≤1000)个长度不超过2000的模式串,问每个模式串是否在文本串中出现过? •几乎和周一课件上的第一个例题一模一样.. •把文本串丢到AC自动机里面去跑. •注意: •1.可能有两个相同的模式串(略坑吧.) •2.一个模式串可能是另一个模式串的后缀,即如果一个点的fail指针指向的点是一个“危险节点”,那么它本身也是一个“危险节点”. 1 #include <ios

EXAM个人训练赛四

EXAM个人训练赛四 已完成 [x] A [x] D [x] E [x] F [x] J [x] K [x] I* 未完成 [x] B [x] C [x] G [x] H 签到水题 A J F A:英文字母有2426个 J:注意long long D:Transit Tree Path 我直接套了单源最短路的一个模板,有人用的是DFS,模板第一次用,记得是无向图. 代码又臭又长: #include<bits/stdc++.h> using namespace std; const int ma

EXAM个人训练赛五

EXAM个人训练赛五 已完成 [x] A [x] E [ ] K* [x] M* 未完成 [ ] C [ ] F 放弃没人做出来的题 A 要用ll,然后注意正方形的情况,细心一点 E 有点动态规划的感觉,状态的转移,不难,要注意不要漏掉状态 K 正解是DFS 然后用贪心数据弱的话能过,先排圆心 M 树状数组,可以维护前面有多少数比这个数小,然后通过相减也可以得出后面有多少数比它小,后面要用到容斥的思想 12xx(xx比1 2大)可以通过组合数算出,即前面比它小的选一个,后面比它大的选两个,然后相