2019基地校Day6

最后一天了。

但是结束又是开始,明天就要去纪中培训了。

(虽然这篇博客是31号写的)


T1:【星々の絆】(传送门

推了两个小时的规律,没个结果差点就要放弃了。

最后灵光一现,想出了正解。

将n个数分成i组,每次将每组最前面的数移到该组最后面。不难发现,若n是i的倍数,那么需要移动的数只有n/i个;若不是,需要移动的数就是n/i+1个。从后往前for,先找到最后一组需要移动的数,挪到最后一个数的后面。然后再往前找倒数第二个要移动的数,它要去到的位置实际上就是前一个数挪动前的位置。那么对于每次的操作,整个数组的位置都会向后移一格。(不是很理解的可以在纸上操作一下,就可以发现具体的数值变化)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for(int i=1;i<=n;i++)
    a[i]=i;
last=n;
for(int i=2;i<=n-1;i++)
{
    cnt++;
    if(n/i!=0)
    {
        a[++last]=a[n/i*i+1+cnt];
        for(int j=n/i*i-(i-1)+cnt;j>=1+cnt;j-=i)
            a[j+i]=a[j];
        continue;
    }
    a[++last]=a[n-i+1+cnt];
    for(int j=n-2*i+1+cnt;j>=1+cnt;j-=i)
        a[j+i]=a[j];
}
for(int i=n;i<=2*n-2;i++)
    printf("%d ",a[i]);
printf("%d",a[n-1]);

cnt与last实际上就是数组在操作过程中的第一位的下标和最后一位的下标。


T2:【-Star Divine- フィナーレ】(传送门

竟然有一个t=0什么都不用输出的数据。出题人好良心。

所谓正解只有jjy一句话:总的方案数减去不可行的方案数。

未完不续


T3:【悲劇】(传送门

考试的时候贪心只有24分。维护前缀和,对于每个区间判断一下是1多还是0多,1多的话就选择这个区间。

目前没有正解,未完不知道续不续。

继续阅读2019基地校Day6

基地校Day6

T1山魔

少考虑一种情况

数学死在分类讨论 这里也死这

题目改下就是做过的烤面包了

代码没变 o改下题目我就错了


T2福尔贝斯太太的快乐夏日

题目的条件就没看懂

看懂了也不会做(小声bb)


T3光恰是水

兄弟俩也太幸福了叭!!还有物质奖励

所以他们的幸福是我的不幸

有思路 不会打代码


T4雪地上你的血迹

求了四分之一圆的范围

样例没过 没求就过了

最后没求范围

o所以可能我只对了样例


Day1八十Day6也八十

还能保持好满足!

最差的是Day4 考太差了我该怎么说

Day5是真的激动 比goddess高了13分!!!

学府新初二第一 好神奇我的妈!

可能是第一次也是最后一次好好珍惜!!

我只是来打个电话(珠心算进阶!) o(゚Д゚)っ Oh,my god !

今天聊的是一个很悲伤的话题,先配个图:

咳咳,珠心算的进阶版
崩了(o)//

http://59.61.214.20:3001/oj/#main/show/2542

对于我来说,珠心算已经难得不要不要了
but,老师说我怎么简单的题都错,不应该啊
So:只好写写题解加深记忆,再不行只能记下来了o()o


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
#include<cstdio>
using namespace std;
int f[5001];//依题意n的值开到5001
int h[20001];//有点桶排的影子,so依提议开到20001
int main()
{
    freopen("telephone.in","r",stdin);
    freopen("telephone.out","w",stdout);//你懂的
    int n,t=0;//n是数的个数,t记录答案
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>f[i];//至此以上都是输入
        h[f[i]]++;//将输入进来的数存储到“桶”里(非常重要)
    }
   
    for(int i=1;i<n;i++)
    {
        for(int j=i+1;j<=n;j++)//因为本次数据高于100,所以n的三方是不行的,只能开两重循环(也很重要)
        {
            if(h[f[i]+f[j]])//(最重要的来了)判断两数之和是否为另一个数,这里是从三重循环到两重循环的关键语句!!!
            {
                t+=h[f[i]+f[j]];//如果这个数等于两数之和,那么记录这个数在数组中!此数出现的个数!(这是难点!)
                h[f[i]+f[j]]=0;//如果这个数判断过了,就标记为零,防止重复搜索(也很重要)
            }
        }
    }
   
    cout<<t;//咳,输出
   
    return 0;
}

其实这道题做了很多遍了,但是还是只能理解,无法码代码
这是我的一个弱点w(゚Д゚)w(太可怕了,怎么水的题为什么我还不会)

So:一定要把这题哪怕背下来都要打出来!!!

基地校Day5打卡ヾ(o◕∀◕)ノヾ

懒得说废话,切入正题:

No.1:我只是来打个电话 emmm没什么可说的,就是据题意模拟,but只有40分,一是时间超限,二是算法有问题。ヾ(。`Д´。)后来改了一下,用一个(int或bool类型)的数组来标记,凡是两两相加得到的数就判断为true(或1),这样比开三重for快多了

N0.2:八月惊魂 出乎意料的题目理解了,but怎么把n个数字组成的每个数求出来不懂m(_ _;;m。学长说从后往前找到第一个逆序列的交换位置,把后面的全部按顺序排列(还是懵懵的),知道为什么,却不知道怎么做(555~)

No.3:玛利亚,多斯普拉泽雷斯  这题我打了130多行代码,却还是错的,69分(555~),学长说用博弈,(博弈是什么东东)有理解一丢丢,还没试着打。

No.4:十七个中毒的英国人  学长说用并查集做,…(⊙_⊙;)…好。的。吧。没想过并查集打呢。。。

Byebye(~o ̄▽ ̄)~o 。。。滚来滚去……o~(_△_o~) ~。。。