王道机试指南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;
}