从零开始
评审结果
Accepted
通过
Wrong Answer
检查正确性、鲁棒性(你的算法只对小部分数据有效)
Presentation Error
你的输出结果是正确的,但你没有按照题目要求的输出格式输出,检查是否输出了多余或缺少空格或符号
Time Limit Exceeded
你的算法超出了时间,检查正确性(死循环、无限递归)、高效性(重新设计更加高效的算法)
Runtime Error
可能出现了数组越界、一个数除以0的错误、异常调用(调用了被禁止的函数和方法)
Compile Error
你的算法根本没有通过评测系统的编译,检查编译语言(比如你写的C++,提交成了java)、或缺少某种头文件
Memory Limit Exceeded
可能是设计的数组过大了,或不断申请 (比如你一个变量写在了循环里面,就会不断的申请空间,从超出了)
Output Limit Exceeded
程序输出了过多内容(少见)
工具推荐
语言
C/C++
开发环境
codeblocks,下载版本(推荐):codeblocks-20.03mingw-setup.exe
评测系统
输入格式
单组输入
北大poj的第1000题
scanf("%d %d",&a,&b);
printf("%d\n",a+b);
多组输入,未知组数
杭电的第1089题
while(scanf("%d %d",&a,&b)!=EOF){
printf("%d\n",a+b);
}
多组输入,指定组数
杭电的第1090题
scanf("%d",&n);
while(n--){
scanf("%d %d",&a,&b);
printf("%d\n",a+b);
}
多组输入,特定跳出
杭电的第1091题
while(scanf("%d %d",&a,&b)!=EOF){
if(a==0 && b==0) break;
printf("%d\n",a+b);
}
暴力求解
枚举策略——列出所有可能的情况
判断一个题能否使用枚举?
分析数据量:比如一般机试程序要求在1s内完成
例题2.1 abc
分析一下:
abc=100a+10b+c
bcc=100b+11c
那abc+bcc=100a+110b+12c
那去提交
#include <stdio.h>
int main() {
int a, b,c;
for(int a=0;a<=9;a++){
for(int b=0;b<=9;b++){
for(int c=0;c <= 9;c ++ ){
if(100*a + 110 * b + 12 * c == 532)
printf("%d %d %d\n",a,b,c);
}
}
}
return 0;
}
例题2.2反序数
求逆序数(反序数)的核心代码
//求逆序数
int a = 1234;
//1234%10=4 4
//1234/10=123 4*10=40
//123%10=3 40+3=43
//123/10=12 43*10=430
//12%10=10 430+2=432
//10/10=1 432*10=4320
//1%10=1 4320+1=4321
int b = a % 10;//1234,4
while(a>10){
a=a/10; //123,4 //12,43 //10,432
b=b*10+(a%10);//123,43 //12,432 //10,4321
}
printf("%d",b);
本题全部代码
#include <stdio.h>
int reverse(int number) {
int reverseNumber = 0;
while (number != 0) {
reverseNumber *= 10;
reverseNumber += number % 10;
number /= 10;
}
return reverseNumber;
}
int main() {
for (int i = 1000; i <= 9999 && i * 9 <= 10000; i ++) {
if (i * 9 == reverse(i))
printf("%d\n", i);
}
return 1;
}
例题2.3 平方对称数
#include <stdio.h>
int Reverse(int num) {
int reverseNum = 0;
while (num != 0) {
reverseNum *= 10;
reverseNum += num % 10;
num /= 10;
}
return reverseNum;
}
int main() {
for (int i = 1; i <= 256; i++) {
//看它的平方是否等于它平方的反叙述
if ((i * i) == Reverse(i * i)) {
printf("%d\n", i);
}
}
return 1;
}
模拟——根据题目规则编写代码
图形排版
例题2.4 输出梯形
分析
代码
#include <stdio.h>
int main() {
int h;
printf("请输入h:");
while (scanf("%d", &h) != EOF) {
int row = h;
int col = h + 2 * (h - 1);
//输出每行每列
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (j < col - (h + 2 * i))
printf(" ");
else
printf("*");
}
printf("\n");
}
}
}
例题2.5 叠框目前看有点难,先放放
日期
例题2.6 今年的第几天? (🍀 )
#include <stdio.h>
//里外都是花括号,并且最后要打分号
int dayTab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int isLeapYear(int year) {
//别总是忘记打分号
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
int year, month, day;
while (scanf("%d%d%d", &year, &month, &day) != EOF) {
int number = 0;
int row = isLeapYear(year);
for (int j = 0; j < month; j ++) {
number += dayTab[row][j];
}
number += day;
printf("%d\n", number);
}
return 0;
}
例题2.7 打印日期
#include <stdio.h>
int dayTab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
int number, year, month, day;
while (scanf("%d%d", &year, &number) != EOF) {
int row = isLeapYear(year);
month = 0;
while (number > dayTab[row][month]) {
number -= dayTab[row][month];
month ++;
}
day = number;
printf("%04d-%02d-%02d\n", year, month, day);
}
return 0;
}
其他模拟
例题2.8 手机键盘(有难度,先放放)
排序与查找
排序
可以直接调用c++的sort函数,它是基于快排实现的。
sort有三个参数:first(起始位置)、last(终止位置)、comp(比较函数)。
例题2.9 排序
犯过的错
1.输入两个变量,我却只写了一个%d
错误:
scanf("%d",&a,&b);
正确:
scanf("%d %d",&a,&b);
2.奇怪,牛客return 1不能通过,改成return 0就能通过了,哈哈哈,小秘密被我发现了吧。
明明有输出,但还没有输出程序就结束了的原因
- 有时候,写输入的时候有的忘写&符号了,导致程序提前结束。