2016山东省第七届ACM省赛总结

好久都没更过了 前段时间真是心态不好 状态也不好 都不打算练了 自己堕落了一阵子 醒悟了 感觉还是应该干些正事 加上去北京旅游(lanqiao)待了几天 心情也好多了 啊 自己太水 还要接着干。

好 进入正题。


热身赛:

前半场打CCCC,机房网络无力吐槽,热身赛被题目嘲笑了。。第一题输出济南除了趵突泉还有多少泉(71),然而我们仨都表示并不知道。。最后这题也没过,写了一个B题过了,二分,题目不细说了,过了之后测试机器,热身赛草草收场。

正式赛:

本场一共12题,开场的时候心情比较紧张,拿到题目就开始读,很快读出A,是水题,大意就是小明(忘了主角叫啥了)要背英语单词,n个单词背m天,问每天至少背几个,很简单n/m上取整就可以了。

A Julyed 水题 1/3

然后读了B,关于Fibonacci数列的,当时感觉B题不如别的好做,就先换了别的,第二题开的K,大意是给一个字符串,包含多个单词,把所有单词反过来输出,但总顺序不变,比如eno owt变成one two,也是水题。

K 字符串水题 1/13

做完这题之后开了C,C其实是个最短路,但由于当时题意没读好(我的锅),错了一发,错了之后我们换了其他题目,第二次交的时候数组开大了,T了一发,最后才过。C题错了之后我们换了E,大意是给一块地,#代表房间,.代表空地,要求找出仅与一个房间相邻(上下左右)的空地位置有多少个(可以超出边界),也很简单,在图的四周再铺一圈 . ,然后暴力枚举每个 .就可以了。

E The Binding of Isaac 1/27

因为C题读了几遍还是没有理清题意,下一个就是B了,给一个数(<=10^9),将她表示为几个Fibonacci数的和,如果不能,输出-1,这题用upper_bound做的,二分,每次查询距离目标数字最近的f数,然后减掉,以此类推。

B Fibonacci 1/49

四个水题开完(2333),再回到C,又读了好几遍题意,还是没读懂,这时候场上不少队伍(忘了具体几个了)出了J,J题目挺长的,一个游戏相关的,我没读不太清楚题意,好像也是水题,这题就不细说了也是1Y。

J Execution of Paladin 1/89

最后轮到C了,最终的做法是从终点往前做一次最短路,然后枚举中间的点,更新答案(0-i的距离+i到终点的最短路),这个中间点必须与起点0直接相连,由于数组开大了T了一次,第三次过了。

C Proxy 3/104

然后是G题博弈,给N个石子,分成三堆玩Nim游戏,问后手必胜的策略有多少,俩队友打出了几页数据去找规律了,我读了H,一个小模拟,模拟当输入的字符串长度超过字符串限定长度时的输出,题意不太好讲就不说了,总之是个小模拟,记得不到100行,第一次交错了,忽略了中间的空格,这时候他俩推出了G,我不知道哪错了开始吃东西(= =),G题过,然后把H改了改,紧张的又交了一发,过了

G Triple Nim 1/179

H (忘了叫啥) 2/191

接下来就很尴尬了,还剩一个半小时,场上D和F出的差不多,F是个动归,喂猴子的问题,D最后问了菊苣们是类似于归并排序的东西,就是有个比赛,每一轮都要按分数重新排序,然后i和i+1比赛,赢得加一分,输的减一分。

最后这俩题也没能出了,感觉挺可惜的,比完还一直担心会不会掉到银牌第一(....),大概就是这样,8题手速金,深刻的认识到了自己水,稍微有点难度的就转不过弯来,这学期也落下不少,要好好补补了,最后的榜我们上面的全都过了F...(捂脸逃)


PS:向我们代码手myz小朋友致敬

PPS:山师好多妹子

题目还没出,先贴个榜吧

点击打开链接

-------------------------------------------分割线------------------------------------------------

今天出题目了,不得不更新一发了,非常非常的郁闷,当时是他们俩在推F,我自己看了D,出来之后大家都说那是个一眼DP嘛,我们没做出来,我DP很烂,也不太会推那种循环写法的,也就没参与想,万万没想到今下午闲的没事花了半小时写了一发居然过了 = =,我现在有点后悔,当时没敢做。。。

贴代码以及题目,记住这个教训

Feed the monkey

Time Limit: 2000MS Memory limit: 131072K

题目描述

Alice has a monkey, she must feed fruit to the monkey every day.She has three kinds of fruits, bananas, peaches and apples. 
Every day, she chooses one in three, and pick one of this to feed the monkey. But the monkey is picky, it doesn’t want bananas for more than D1 consecutive days, peaches for more than D2 consecutive days, or apples for more than D3 consecutive days. Now Alice has N1 bananas, N2 peaches and N3 apples, please help her calculate the number of schemes to feed the monkey.

输入

 Multiple test cases. The first line contains an integer T (T<=20), indicating the number of test case.
Each test case is a line containing 6 integers N1, N2, N3, D1, D2, D3 (N1, N2, N3, D1, D2, D3<=50).

输出

 One line per case. The number of schemes to feed the monkey during (N1+N2+N3) days.
The answer is too large so you should mod 1000000007.

示例输入

1
2 1 1 1 1 1

示例输出

6

提示

 Answers are BPBA, BPAB, BABP, BAPB, PBAB, and ABPB(B-banana P-peach A-apple)

来源

 “浪潮杯”山东省第七届ACM大学生程序设计竞赛
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 51;
const int mod = 1000000007;
int T,n;
int a[10],b[10];
int d[maxn][maxn][maxn][3][maxn];
int solve(int day,int a0,int a1,int a2,int id,int last){
    if(d[a0][a1][a2][id][last] != -1) return d[a0][a1][a2][id][last];
    //cout<0&&a0>=1)tt+=solve(day+1,a0-1,a1,a2,0,1);
        if(b[1]>0&&a1>=1)tt+=solve(day+1,a0,a1-1,a2,1,1);
        if(b[2]>0&&a2>=1)tt+=solve(day+1,a0,a1,a2-1,2,1);
    }
    else {
        if(id == 0){
            if(last+1<=b[0]&&a0>=1) tt+=solve(day+1,a0-1,a1,a2,0,last+1);
            if(b[1]>0&&a1>=1) tt+=solve(day+1,a0,a1-1,a2,1,1);
            if(b[2]>0&&a2>=1) tt+=solve(day+1,a0,a1,a2-1,2,1);
        }
        else if(id == 1){
            if(last+1<=b[1]&&a1>=1) tt+=solve(day+1,a0,a1-1,a2,1,last+1);
            if(b[0]>0&&a0>=1) tt+=solve(day+1,a0-1,a1,a2,0,1);
            if(b[2]>0&&a2>=1) tt+=solve(day+1,a0,a1,a2-1,2,1);
        }
        else {
            if(last+1<=b[2]&&a2>=1) tt+=solve(day+1,a0,a1,a2-1,2,last+1);
            if(b[1]>0&&a1>=1) tt+=solve(day+1,a0,a1-1,a2,1,1);
            if(b[0]>0&&a0>=1) tt+=solve(day+1,a0-1,a1,a2,0,1);
        }
    }
    if(tt>mod)tt %= mod;
    if(day == n) return d[a0][a1][a2][id][last] = 1;
    return d[a0][a1][a2][id][last]=tt;
}
int main(){
    //freopen("in.txt","r",stdin);
    scanf("%d",&T);
    while(T--){
        memset(d,-1,sizeof d);
        for(int i=0;i<3;i++)
        scanf("%d",&a[i]);
        for(int i=0;i<3;i++)
        scanf("%d",&b[i]);
        n = a[0]+a[1]+a[2];
        printf("%d\n",solve(0,a[0],a[1],a[2],-1,0));
    }
    return 0;
}


你可能感兴趣的:(经验总结)