马上 \; CSP复赛 \; 要考试了。我这里总结了几点考场上要注意的:
一、爆0的情况
1. 文件名错误
比赛三个半小时,共有4道题目。每道题目都有一个特定的文件名(一般是英文),评测系统是根据文件名字寻找
你的代码的。如果你连文件名都写错了,那么:
找不到文件 \color{Cyan}\colorbox{Violet}{找不到文件} 找不到文件 , 于 是 , 你 光 荣 的 爆 0 了 。 ,于是,你光荣的爆0了。 ,于是,你光荣的爆0了。
解决方法
(1). 对于拼写错误的,不多赘述。请检查你的文件名;
(2). 对于以下情况:
请进行如下操作(win10系统):
- 打开“此电脑”;
- 选择“查看”:
- 将“文件扩展名”一栏勾上。
此时你会发现:
危 \color{Balck}\colorbox{Red}{危} 危
2. MLE
什么是MLE呢?简单来说,就是`空间限制超限`,就是`Memory Limit Exceeded`。这会导致你这道题一分没有,
爆0.
解决方法:
1.计算空间复杂度 S(n)(划重点!)
平常的题目内存限制都是 125.00MB 。看似挺大的。但数组很占空间。一个 int 类型的数组要4 byte,long long 类型的8个字节,char类型的1 byte。
为了好计算,
我
们
把
128
M
B
作
为
内
存
限
制
。
我们把128MB作为内存限制。
我们把128MB作为内存限制。
1
M
B
=
1024
K
B
,
1
K
B
=
1024
B
,
1
B
=
8
B
y
t
e
1MB=1024KB,1KB=1024B,1B=8Byte
1MB=1024KB,1KB=1024B,1B=8Byte
∴
\therefore
∴
128
M
B
=
1
×
2
7
+
10
+
10
−
3
+
1
=
2
25
=
33554432
128MB=1 \times2^{7+10+10-3+1}=2^{25}=33554432
128MB=1×27+10+10−3+1=225=33554432
再
开
个
平
方
:
33554432
≈
5792.618
再开个平方:\sqrt{33554432}\thickapprox5792.618
再开个平方:33554432≈5792.618
所以,一般开
i
n
t
int
int类型的数组不要超过
5500
5500
5500。二维不要超过
[
220
]
[
220
]
[220][220]
[220][220]。
2.减少递归算法的使用(很占空间!!!)
3. 文件读写操作写错
每道题都要加读写操作。如果没有的话。很可惜,你 “爆0” 了。
详细请见:关于freopen
解决方法:
1.会写文件读写操作。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int main(){
//这两行为文件读写操作。
freopen("plus.in","r",stdin);
freopen("plus.out","w",stdout);
//具体名称以考试为准。
cin>>n>>m;
cout<<n+m;
return 0;
}
2.专门留下几分钟检查读写操作
!!!
4.RE
何为RE?就是 “Runtime Error” ,即运行时错误。原因主要有以下几点:
1.主函数类型写成void。
在CSP以及之后的NOIP等考试中,c/c++主函数类型必须为int,否则会报错。
2.没加return 0.
重要的事情说三遍:必须要加retrun 0!必须要加retrun 0!!必须要加retrun 0!!!以及:
using namespace std;
3.即为:
int main(){
int a[20];
for(int i=1;i<=20;i++){
cin>>a[i];
}
return 0;
}
数组是从0开始的……
4.除以0:
while(n>=0){
cout<<m/n;
n--;
}
二、可能会丢分的操作。
1.代码错误。
不说了好吧……
2.TLE。
何为TLE内?
TLE是指 `Time Limit Eceeded` 。即为:空间限度超限。可能导致的情况:
1.循环次数太多。
计算机在执行 1 0 8 10^8 108以内的操作时是不会超时的。但如果:
for(int i=1;i<=1000;i++){
for(int j=1;j<=1000;j++){
for(int k=1;k<=1000;k++){
a[i][j][k]+=a[i-1][j][k]+a[i][j+1][k]+a[i][j][k+1];
}
}
}
TLE和MLE警告 \color{Cyan}\colorbox{Violet}{TLE和MLE警告} TLE和MLE警告
2.搜索未记忆化
//记忆化代码:
int h[100][100];
int dfs(int n,int m){
if(h[n][m]) return h[n][m];
h[n][m]=h[n][m+1]+h[n+1][m];
return h[n][m];
}
三、我总结的一些考试技巧
1.暴力
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
int sum=0;
int n;
scanf("%d",&n);
for(int a=1;a<=3;a++){
for(int b=1;b<=3;b++){
for(int c=1;c<=3;c++){
for(int d=1;d<=3;d++){
for(int e=1;e<=3;e++){
for(int f=1;f<=3;f++){
for(int g=1;g<=3;g++){
for(int h=1;h<=3;h++){
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
if(a+b+c+d+e+f+g+h+i+j==n){
sum++;
}
}
}
}
}
}
}
}
}
}
}
cout<<sum<<endl;
for(int a=1;a<=3;a++){
for(int b=1;b<=3;b++){
for(int c=1;c<=3;c++){
for(int d=1;d<=3;d++){
for(int e=1;e<=3;e++){
for(int f=1;f<=3;f++){
for(int g=1;g<=3;g++){
for(int h=1;h<=3;h++){
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
if(a+b+c+d+e+f+g+h+i+j==n){
printf("%d %d %d %d %d %d %d %d %d %d\n",a,b,c,d,e,f,g,h,i,j);
}
}
}
}
}
}
}
}
}
}
}
return 0;
}
/*
————————————————
版权声明:本文为CSDN博主「ipraew」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Athena_Oria/article/details/70195522
*/
暴力程序因情况而定。
这
些
仅
为
打
表
,
不
可
作
为
程
序
!
这些仅为打表,不可作为程序!
这些仅为打表,不可作为程序!
俗话说得好:暴力出奇迹,打表过样例!
\color{Cyan}\colorbox{Violet}{俗话说得好:暴力出奇迹,打表过样例!}
俗话说得好:暴力出奇迹,打表过样例!
具体请看:CSP考试技巧——对拍程序
2.骗分。
看这道题:
滴
滴
打
车
滴滴打车
滴滴打车
(
c
a
r
.
c
p
p
)
(car.cpp)
(car.cpp)
【问题描述】
轩轩和凯凯准备去卡其米星球找其他小朋友一起玩《我的世界》。滴滴打车推出了“拼车”活动,对于某一目的地,不论一个人坐车去还是一堆人一起去,总共需要支付的钱是一样的(每辆车上除了司机最多坐4人)。
这时,凯凯家门口聚集了很多小朋友,原来他们也都准备带着自己的模组去卡其米星球,假设有 N 位小朋友准备拼车,此时为0时刻,从凯凯家到卡其米星球需要花 D 元打车费,凯凯想在 S 分钟以前(包括第S分钟)到达卡其米星球,因为太晚了模组会坏掉,现在给出S分钟当中所有 K 辆出租车先后达到凯凯家门口的时间Ti及里面剩余座位Zi。
凯凯心里想:“time is money”,凯凯觉得每个人等车的分钟数等同于花了相同多的钱(比如凯凯等了40分钟,相当于他多额外花了40元钱)。
在保证所有小朋友都能在模组损坏前到达卡其米星球的情况下,请你计算他们最少需要花费多少钱?
【输入格式】
输入文件名为 car.in。
第一行,四个整数,N,K,D,S,具体含义参照题目描述。
接下来有K行,每行两个整数Ti和Zi,表示第i辆车在第Ti分钟到达凯凯家门口,空余的座位数为Zi(到达时间已按先后顺序给出)。
【输出格式】
输出文件名为 car.out。
一行,如果所有小朋友能在模组损坏前到卡其米星球,则输出一个整数,代表所有小朋友最少需要花的钱(单位:元),否则请输出“impossible”。
【输入输出样例 1】
car.in car.out
2 2 10 5 14
1 1
2 2
【输入输出样例 1 说明】
2个小朋友坐第2分钟到达凯凯家门口的车,每个人等2分钟,最少花费为10+2*2=14元。
【数据规模与约定】
对于100%的数据,N ≤ 100,K ≤ 100,D ≤ 100,S ≤ 100,1 ≤ Zi ≤ 4,1≤ Ti ≤ Ti+1 ≤ S。
所以,你只要:
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"impossible";
return 0;
}
就能骗到至少10分。
3.调试DEV-c++
调成这个页面就行啦!
方法:
把项目管理一栏勾上。再设置断点,慢慢调试。就可以模拟计算机的运行啦!
4.编写生成随机数的程序:c++中如何生成随机数?
这样你在过了样例不放心时,就可以再生成一组数据了!