六月六日补题目日记:Codeforces Round #878 (Div.3)

这是在coderforces上的第一篇博客,竟然说不合格,服了,对于一个题目,怎样发挥最大的意义,在一本书里看到的这段话感觉非常好:

1怎样做出来,有没有更好更简洁的做法

2 为什么这样做

3下次如何想起来

4联想一下题目有啥好玩的地方,能不能和现实生活联系起来

5博弈论:看样例和最后答案之间的关系

以后补题目的时候,对于每个题目都按照这样的思路和顺序来补题,这样能够发挥题目的最大的作用;

另外,我在做英语阅读理解的时候先看问题,然后再去找题目,这样目标性更加强一点,所以读题目的时候也应该是按照章法来的,先看题目,写出来目标,然后读题意,写出解决问题的条件,这样能够使得读题目的时候更加有效率

A: 这个题目当时看题意的时候没有理解题意,第二个操作说的是增加supplementary,到现在也不是很理解为什么是补充的字符,按照样例,就是增加一个一样的字符,中间的字符都是加密用的,解密的时候都可以直接去除: 1:从前到后扫描,一直到遇见相同的,忽略到不相同的字母,把这个相同的字母放到string里面,然后跳转到下一个; 看了更加简短的做法:首先可以不用借助变量,可以直接输出,我的代码可以直接这样改正 更加简洁的一个做法是我们规定有效值为fc,无效值为c,刚开始肯定是有效值,我们直接输出,如果不相同肯定是无效值,直到遇见相同的,我们继续输入这个有效值,并且输出,然后用这个有效值作为一个标准,观察接下来的到底是有效值还是无效值 2:按照题意就应该是是这样,注意这种题目类型,有时候可以直接通过输出,不一定非得操作 3: 4:这也是一种简单的加密方式,可以作为信息加密的一种方式

B: In how many different ways can he buy several desserts (possibly zero) for tasting?首先这次比赛问的问题都是这种解决问题的方式的个数;看题解当中出现的问题:为什么有个30?其实注意下pow这个函数的原型float pow(float x, float y); 返回的时候注意一下;还有就是数据范围的问题:int的数据范围-2147483648 ~ 2147483647(一共是10位)(-2^31 ~ 2^31 — 1)首先这个题目有补充的语法知识,但是这不是最重要的,我们先说这个思路真的绝: 1. 如果有n块钱,那么最多有n + 1种方式,当然了,可能商品没有那么多,所以就需要看看商品方式是不是更少 如果有k个商品,那么最多有2^k个方式,当然了,可能钱没有那么多,所以就需要看看钱能买的方式是不是更少 所以答案这样就出来了:min(n + 1,pow(2,k)); 但是这里的k最大是1e9,pow(2,k)k最大就是30,31就会出现溢出 钱最大就是1e9,所以方式最多就是1e9+1,所以这里满足pow不会出现移除就行了,可以采用pow(2,k) — 1的方式,这个返回的是一个浮点数,所以这里应该加上一个强制类型转化(int) 2.为什么这样做呢,两个变量都在变化,这个时候最好是固定一个变量,比如说这个题目,我们固定一个变量如果钱无限多会怎么样,如果商品无限多会怎么样,如果钱很多,方式有 n + 1中 ,但是商品数量对应的方式可能不够,所以这个时候需要看商品,如果商品的方式更少,那这个时候钱肯定满足了 3.以后当有两个条件需要满足的时候可以联想到这个题目,两个条件

C: 1. 1.the number of ways for Dima to choose vacation dates at the resort.咱们就是说这次的出题人比较在意的就是这个方式: 这个思路是真的非常的美丽,真的非常的美丽,超级美丽!!!一个简单的if-else,这样就把思维体现的非常完美,这个可以把符合要求的赋值为1,把不符和要求的赋值为零,但是没关系,可以不用赋值,关键最好的,是代码当中的这个if-else,当时我不会做,以及题解当中的每一段如何统计,都利用这个if-else进行统计了,符合要求要++,不符和要求直接为零,然后就是统计方式个数了,这个问题更加有意思了,比如说一段序列 1 1 1 1 1 1 1 1这些都是符合要求的,如果至少的天数为1,那么增加第一天,方式增加两种,增加第三天,方式增加三种,这个东西增加的是序列长度-最低要求+1 2.这算是一种规律 3.等以后遇见这样的规律题目: [1], [2], [3], [1, 2], [2, 3], [1, 2, 3].也就是求大于给定长度的连续子序列的个数: 求法:从大于等于最低要求开始,加上这个序列的长度-最低要求+1 4.努力了这么多天 努力一天就++,结果一天不注意,直接赋值为零哈哈哈这个联想如何:这个就是用来求符合要求的一段序列,你敢向,人家连数组都没有用,就把这个题目解决了

D.题意关键是一个人可以同时处理好几个任务,并且花费的时间是这里面最多的 有个人写了非常简洁的代码:但是我不是很理解:等以后再来看这个题目:

//题目当中最重要的意思是一个人可以同时处理多个任务 //并且耗费的时间是 最大的那个

​
include 
using namespace std; int t,n,a[200005]; int main() { cin>>t;

while(t--){
    cin>>n;

    for (int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1); 
    int l=0,r=1e9;//这里搜索的是答案 可能花费0秒
    //也可能花费 很长时间 现在来检验一下时间是不是合适

    while(l>1,i=1,j=n;
       cout << "m " << m << endl;
       while(i+1<=n&&a[i+1]-a[1]<=2*m) i++;
       while(j-1>0&&a[n]-a[j-1]<=2*m) j--;
       cout << "i " << i << " " << j << " " << endl;
       i++,j--;
       if(i>j||a[j]-a[i]<=2*m)   r=m;
       else  l=m+1;
    }
    cout<

你可能感兴趣的:(算法)