关于Algorithm IO3模拟赛的总结
来源:互联网 发布:50道js经典逻辑题 编辑:程序博客网 时间:2024/06/06 10:07
- T1 东东取礼物giftccpp
- 题目描述
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 数据范围与约定
- 初代码
- 初分数
- 改代码
- 经历
- 感想改进
- T2作业排序taskcppc
- 题目描述
- 输入格式
- 输出格式
- 样例输入
- 数据范围与约定
- 初代码
- 初分数
- 改代码
- 经历
- 正解是贪心
- 感想改进
- 东东跑步 runcppc
- 问题描述
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 数据范围与约定
- 经历
- 代码
- 总结
T1 东东取礼物(gift.c/.cpp)
题目描述
输入格式
过中秋节了,东东爸 也准备了礼物要给东东——money。当然礼物不是money那么俗气,因为东东爸答应,用东东 拿到的所有money去超市买成东东最喜欢的糕糕。(为什么中秋节不买月饼,因为东东偏爱糕糕多一些)。东东爸 也给东东 制造了困难, 不能那么容易就让东东 得到这些money。顺便也让东东 动动脑筋,长大以后才能聪明嘛!
东东爸 把money分成N份,放到N层的书架上,每层可能有0条、1条或者多条连接线连接比当前层低的某层。任意选择一层开始,只能沿着当前层的某条连接线走向下面的某层,到达这一层后,这层的money才能得到。也就是如果拿了一层的money后,就可以顺着连接线向下层去拿那层的money,直到没有连接线停止。
东东当然聪明无比,一下就拿到了最多的money。你能行么?
输出格式
只有一个正整数,表示东东 可能拿到的最多的money。
样例输入
312 2 32030
样例输出
42
数据范围与约定
N<=100 , 1<=xi<=10000
初·代码
#include <iostream>#include <cstdio>#include <queue>#include <algorithm>using namespace std;struct p{ int from; int to;}qwe[6000];int numdot,longpath[110],done[110],ip=0,ans=0,money,a,map[110][110];char inp;void dijkstra(){ memset(longpath,0,sizeof(longpath)); memset(done,0,sizeof(done)); int temp,workdot; for(int i=0;i<=numdot;i++) { temp=-1; for(int j=0;j<=numdot;j++) if(longpath[j]>temp&&done[j]==0) temp=longpath[j],workdot=j; done[workdot]=1; for(int j=0;j<=numdot;j++) if(map[workdot][j]+longpath[workdot]>longpath[j]&&map[workdot][j]) longpath[j]=map[workdot][j]+longpath[workdot]; }}int main(){ freopen("gift.in","r",stdin); freopen("gift.out","w",stdout); int numpath=0; scanf("%d%c",&numdot,&inp); while(ip<numdot) { scanf("%d",&a); if(inp=='\n') { ip++; map[0][ip]=a; money=a; }else { qwe[++numpath].from=ip; qwe[numpath].to=a; } scanf("%c",&inp); } for(int i=1;i<=numpath;i++) { map[qwe[i].from][qwe[i].to]=map[0][qwe[i].to]; } dijkstra(); for(int i=1;i<=numdot;i++) { if(longpath[i]>ans) ans=longpath[i]; } printf("%d",ans); return 0; fclose(stdin); fclose(stdout);}
初·分数
0(WA)
改·代码
#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <algorithm>using namespace std;int Numdot,map[110][110],path[10010][3],Numpath=0;char reader[1000];int main(){ freopen("gift.in","r",stdin); freopen("gift.out","w",stdout); int ans=0; cin>>Numdot; gets(reader); for(int i=1;i<=Numdot;i++) { gets(reader); int Makenum=0,Numnum=1; int len=strlen(reader); for(int temp=0;temp<=len;temp++) { if(reader[temp]!=' '&&temp<len) Makenum=Makenum*10+reader[temp]-'0'; else { if(Numnum==1) { map[0][i]=Makenum; } else { path[++Numpath][1]=i; path[Numpath][2]=Makenum; } Numnum++; Makenum=0; } } } for(int i=1;i<=Numpath;i++) { map[path[i][1]][path[i][2]]=map[0][path[i][2]]; } for(int k=0;k<=Numdot;k++) for(int i=0;i<=Numdot;i++) for(int j=0;j<=Numdot;j++) if(map[i][k]&&map[k][j]) map[i][j]=max(map[i][j],map[i][k]+map[k][j]); for(int i=0;i<=Numdot;i++) for(int j=0;j<=Numdot;j++) ans=max(ans,map[i][j]); cout<<ans; fclose(stdin); fclose(stdout); return 0;}
经历
今天脸黑,早上电脑开机一会死机黑屏,换的电脑又死机。读完题发现是个裸图论题,码完dijkstra,发现读图有错误,感觉gets太麻烦,就用是scanf分别读数和空格,在图底加一个虚点,把dijkstra码完。发现又不对,就把虚点放到图顶,再改dijkstra……
最后代码极丑无比,有好多我都不记得是什么的变量——————————->报零
然而正解是floyd(ˉ▽ˉ;)…
感想&改进
算法要想好再码; 代码要想好再码; 题意要读懂再码。
T2作业排序(task.cpp/.c)
题目描述
东东幼儿园的作业非常繁重,为了能让孩子赢在起跑线上,幼儿园的各科老师在十一假期给学生留了很多的各种各样的作业,比如说扫地一次,洗碗一次,数字2写一篇,打球一次等等,并且有很多作业是要在老师规定的截止时间前在网络上提交的。
现在假定一共有N个作业,因为每个作业对于东东来说难度都不大,所以东东都可以在一个单位时间内完成,并且东东每个单位时间只能做一门作业,每个作业有一个最晚完成时间di(0
输入格式
第一行N,表示一共有N个作业。接下来的N行,每行两个数di 和wi,di为正整数,wi为浮点数。
输出格式
一行一个正整数,表示获得的最大的重要程度和,保留2为小数。
样例输入
32 1.11 4.02 3.1
数据范围与约定
对于100%的数据有:1<=N<=100001<=M<=100000<wi<10000
初·代码
#include <iostream>#include <cstdio>#include <queue>#include <algorithm>using namespace std;priority_queue <double> q;int tasks;double ans=0;struct o_O{ int finaltime; double importance;}qwe[10010];int cmp(o_O a,o_O b){ if(a.finaltime>b.finaltime) { return 0; }else if(a.finaltime==b.finaltime) { if(a.importance>b.importance) return 1; else return 0; }else { return 1; } }int main(){ freopen("task.in","r",stdin); freopen("task.out","w",stdout); scanf("%d",&tasks); for(int i=1;i<=tasks;i++) scanf("%d%lf",&qwe[i].finaltime,&qwe[i].importance); sort(qwe+1,qwe+tasks+1,cmp); for(int i=1;i<=tasks;i++) { if(qwe[i].finaltime!=qwe[i-1].finaltime) q.push(qwe[i].importance); else if(q.top()<qwe[i].importance) { q.pop(); q.push(qwe[i].importance); } } while(q.size()) { ans+=q.top(); q.pop(); } printf("%.2lf",ans); return 0; fclose(stdin); fclose(stdout);}
初·分数
0(WA)
改·代码
#include <iostream>#include <cstdio>#include <queue>#include <algorithm>using namespace std;priority_queue <double> q;int tasks;double ans=0;struct o_O{ int finaltime; double importance;}qwe[10010];int cmp(o_O a,o_O b){ if(a.finaltime>b.finaltime) { return 0; }else if(a.finaltime==b.finaltime) { if(a.importance>b.importance) return 1; else return 0; }else { return 1; } }int main(){ freopen("task.in","r",stdin); freopen("task.out","w",stdout); int available=0; scanf("%d",&tasks); for(int i=1;i<=tasks;i++) scanf("%d%lf",&qwe[i].finaltime,&qwe[i].importance); sort(qwe+1,qwe+tasks+1,cmp); for(int i=1;i<=tasks;i++) { if(i==1) { q.push(-qwe[i].importance); continue; } available=qwe[i].finaltime-q.size(); if(available) { q.push(-qwe[i].importance); available--; } else if(-q.top()<qwe[i].importance) { q.pop(); q.push(-qwe[i].importance); } } while(q.size()) { ans-=q.top(); q.pop(); } printf("%.2lf",ans); fclose(stdin); fclose(stdout); return 0;}
经历
这题最开始认为是大水。
但是!!!读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T
发现是个不怎么水的题。放下,写下一个水DP,码完DP后就对这题发呆,直到最后10分钟发现可以用STL堆做,记得我上一次写堆是去年的冬天,一阵码后调了一遍样例过了就交了—————>报零*2
闹心……
正解是贪心!!!!
但我把我的堆简单改了改也A了,不知道是不是解法
感想&改进
要提高码力宜码代码忌扯犊子
东东跑步 (run.cpp/.c)
问题描述:
最近东东迷上了跑步,但是他却不知道自己能跑多远,需要你的帮忙。
已知东东一共有N分钟的时间,每分钟他可以run或者rest。若他在第i分钟run,可以跑出di米,同时疲劳度增加1(初始为0)。若他在第i分钟休息,则疲劳度减少1。无论何时,疲劳度都不能超过M。另外,一旦他开始休息,只有当疲劳度减为0时才能重新开始run。在第N分钟后,他的疲劳度必须为0。
输入格式
第一行两个整数N和M接下来N行每行一个整数,代表di。
输出格式
输出东东最远跑的距离。
样例输入
5 2534210
样例输出
9
数据范围与约定
对于 100% 的数据,保证 N≤2000 ,M<=500 , 0<di<=1000
经历
写一写,码一码------->90(有一点没数据)(AC)
代码
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int f[2010][600],length[2010];int main(){ freopen("run.in","r",stdin); freopen("run.out","w",stdout); int time,tire; cin>>time>>tire; for(int i=1;i<=time;i++) scanf("%d",&length[i]); for(int i=1;i<=time;i++) { int ma; if(i<tire) ma=i; else ma=tire; for(int j=0;j<=ma;j++) { if(j!=0) f[i][j]=f[i-1][j-1]+length[i]; if(j==0) { int an=0; for(int k=i-1;k>=1;k--) { an=max(an,f[k][i-k]); } an=max(an,f[i-1][j]); f[i][j]=an; } } } cout<<f[time][0]<<endl; fclose(stdin); fclose(stdout); return 0;}
总结
这次考试总体不好,第一题,第二题其实可以A(以现在的数据)
但是因为花式读错题+弱弱的码力所以只有第三题码力需求为零的 DP A了
还把fclose写到return后面
我也是醉了<@_@>
- 关于Algorithm IO3模拟赛的总结
- 关于algorithm 104的总结
- io3
- IO3
- IO3
- 关于Algorithm 105的考试总结
- 关于近期模拟赛的总结
- 设计总结2,关于template method 或者algorithm skeleton的一个应用
- JAVA----关于数组模拟链表的练习总结
- 关于实现魔方复原的Thistlethwaite Algorithm
- 关于algorithm头文件的count函数
- 关于头文件algorithm里的排序
- 若干次模拟赛的总结
- JAVA-day12-IO3、反射
- 模拟赛总结。
- 20151004模拟赛总结
- 20151005模拟赛总结
- 20151006模拟赛总结
- 使用MATLAB求积分和极限
- nginx负载均衡和lvs负载均衡的比较分析
- MP3光标
- Linux新手怎样更好地学习各种linux命令
- [C语言] leetcode 118. Pascal's Triangle
- 关于Algorithm IO3模拟赛的总结
- 总结2016.10.7
- 致新手 android中ScrollView嵌套listview
- HOG特征
- Android中AsyncTask和Handler对比
- 【Quadcopter】Content
- 剑指offer:不用加减乘除做加法(java)
- 二叉树的非递归遍历
- 渔盘 融合 无脑定投