王道机试指南2.2暴力求解
例题2.6 今年的第几天(清华大学复试上机题)
#include<iostream>
#include<cstdio>
using namespace std;
int day1[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}
};
bool isLeapYear(int year){
if(year % 100 == 0 && year % 400 == 0) return true;
if(year % 100 != 0 && year % 4 == 0) return true;
return false;
}
int main(){
int year, month, day, sum = 0;
scanf("%d%d%d", &year, &month, &day);
if(isLeapYear(year)){
for(int i = 0; i < month; i++){
sum += day1[1][i];
}
}
else{
for(int i = 0; i < month; i++){
sum += day1[0][i];
}
}
printf("%d\n", sum + day);
}
例题2.7打印日期(华中科技复试上机)
#include<iostream>
#include<cstdio>
using namespace std;
int monthday[2][13]={
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
bool isLeapYear(int year){
if(year % 100 == 0 && year % 400 == 0) return true;
if(year % 100 != 0 && year % 4 == 0) return true;
return false;
}
int main(){
int year, month = 0, sum = 0, row;
scanf("%d %d", &year, &sum);
if(isLeapYear(year)){
row = 0;
}
else row = 1;
for(int i = 0; i < 13; i++){
if(sum - monthday[row][i] > 0){
month++;
sum -= monthday[row][i];
}else{
break;
}
}
printf("%d-%02d-%02d\n", year, month, sum);
}
例题2.8 日期累加(北京理工复试上机)
#include<iostream>
#include<cstdio>
using namespace std;
int monthday[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}
};
bool isLeapYear(int year){
if(year % 100 == 0 && year % 400 == 0) return true;
if(year % 100 != 0 && year % 4 == 0) return true;
return false;
}
int numberOfyear(int year){
if(isLeapYear(year)) return 366;
else return 365;
}
int main(){
int m, year, month, day, n, row;
int number;
scanf("%d",&m);
for(int i = 0; i < m; i++){
scanf("%d%d%d%d", &year, &month, &day, &number);
int row = isLeapYear(year);
//计算总的天数
for(int j = 0; j < month; j++){
number += monthday[row][j];
}
number += day;
//确定年
while(number > numberOfyear(year)){
number -= numberOfyear(year);
year++;
}
//约定月份
row = isLeapYear(year);
month = 0;
while(number > monthday[row][month]){
number -= monthday[row][month];
month++;
}
day = number;
printf("%d-%02d-%02d", year, month, day);
}
return 0;
}
习题2.6日期差值(上海交通大学上机题)
#include<iostream>
#include<cstdio>
using namespace std;
int monthday[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}
};
bool isLeapYear(int year){
if(year % 100 == 0 && year % 400 == 0) return true;
if(year % 100 != 0 && year % 4 == 0) return true;
return false;
}
int numberOfyear(int year){
if(isLeapYear(year)) return 366;
else return 365;
}
int sumday(int year, int month, int day){
int sum = day;
int row = isLeapYear(year);
while(month > 0){
month--;
sum += monthday[row][month];
}
while(year > 0){
year--;
sum += numberOfyear(year);
}
return sum;
}
int main(){
int a, b;
int year1, year2, month1, month2, day1, day2;
scanf("%4d%2d%2d", &year1, &month1, &day1);
scanf("%4d%2d%2d", &year2, &month2, &day2);
int sum1 = sumday(year1, month1, day1);
int sum2 = sumday(year2, month2, day2);
// printf("%d %d\n",sum1, sum2);
int result;
// printf("%d %d\n",sum1 - sum2);
if(sum1 > sum2) result = sum1 - sum2 + 1;
if(sum1 == sum2) result = 0;
if(sum1 < sum2) result = sum2 - sum1 + 1;
printf("%d", result);
return 0;
}
例题2.9剩下的树(清华大学上机)
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int main(){
int l, m, num;
scanf("%d %d", &l, &m);
int flag[l+1];
memset(flag, 0, sizeof(flag));
for(int i = 0; i < m; i++){
int a, b;
scanf("%d %d", &a, &b);
for(int j = a; j <= b; j++){
flag[j] = 1;
}
}
for(int i = 0; i < l + 1; i++){
if(flag[i] != 1) num++;
// printf("%d \n", flag[i]);
}
printf("%d",num);
return 0;
}
例题2.10手机键盘(清华大学复试上机题)
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int keyTab[26]={1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4};
int main(){
string s;
cin >> s;
int sum = s[0], wait = 0, press = 0;
for(int i = 1; i < s.length(); i++){
if(s[i] - s[i-1] == keyTab[s[i] - 'a'] - keyTab[s[i - 1] - 'a']) wait++;
press += keyTab[s[i] - 'a'];
}
// printf("%d %d\n", wait, press);
printf("%d\n", press + keyTab[s[0] - 'a'] + 2 * wait);
return 0;
}
习题2.9 Grading(浙江大学复试上机)
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
double p, t, g1, g2, g3, gj;
double average;
scanf("%lf %lf %lf %lf %lf %lf", &p, &t, &g1, &g2, &g3, &gj);
// printf("%f\n", g1);
if(fabs(g1 - g2) <= t){
average = ( g1 + g2 ) / 2;
// printf("%fppppp\n",average );
}
else{
if( (fabs(g1 - g3) < t && fabs(g2 - g3) > t) || (fabs(g1 - g3) > t && fabs(g2 - g3) < t)){
int temp = fabs(g1 - g3) > fabs(g2 - g3) ? fabs(g2 - g3) : fabs(g1 - g3);
// printf("temp = %f\n", temp);
average = ( g3 + temp ) / 2;
}
if(fabs(g1 - g3) < t && fabs(g2 - g3) < t){
if(g1 > g2 && g1 > g3) average = g1;
if(g2 > g3 && g2 > g1) average = g2;
if(g3 > g2 && g3 > g1) average = g3;
}
if(fabs(g1 - g3) > t && fabs(g2 - g3) > t) average = gj;
}
printf("%.1f", average);
return 0;
}