1. 程式人生 > 實用技巧 >woj1019 Curriculum Schedule 輸入輸出 woj1020 Adjacent Difference 排序

woj1019 Curriculum Schedule 輸入輸出 woj1020 Adjacent Difference 排序


title: woj1019 Curriculum Schedule 輸入輸出
date: 2020-03-19 10:43:00
categories: acm
tags: [acm,woj]

水題,處理好輸入輸出就可以

1 描述

New semester has begun, a lot of students are going to print out their curriculum schedules. They are using the same template, as the
following table shows:

Each student has a list of courses, and the items in the list are of this format:

COURSE_NAME: DAY TIME_SECTION CLASS_NUMBER

COURSE_NAME is the name of the course, which contains no more than 9 characters. Note, the COURSE_NAME may contains white spaces, but NO
trailing or leading white spaces.
DAY is one of the strings of ?MON?, ?TUE?, ?WED?, ?THU?, ?FRI?, respectively representing one of the workday of a week.
TIME_SECTION would be either ?Morning? or ?Afternoon?.
CLASS_NUMBER tells the course will be given in the CLASS_NUMBERth class in the morning or afternoon. If the TIME_SECTION is Morning, the
CLASS_NUMBER is less than 4, and If the TIME_SECTION is Afternoon, the CLASS_NUMBER is less than 3.
Given a list of the courses, just fill every course name to a specific blank in the schedule table.

2 輸入輸出

輸入格式
There are several test cases. Each test case has an integer n, representing the number of courses that listing in the list. Then n lines follow,
each of which are of the form:

COURSE_NAME: DAY TIME_SECTION CLASS_NUMBER

No two different courses are arranged to the same time of the same day.

輸出格式
Output the schedule table. Note, since every blank in the schedule table has 11 spaces, while the length of the course name is no more than 9. So,
you can easily put the name to the blank without any effort. Make sure the course name is written in the middle of the blank. This also can be
easily done if the length of the course name is odd. Otherwise, you can add a white space to the end of the course name, then the length of the
course name becomes an odd number.
See the sample output for more details. Print a blank line after each test case.

3 樣例

樣例輸入
4
Algorithm: WED Morning 2
Algorithm: MON Afternoon 1
Data Base: TUE Afternoon 2
Wavelet: FRI Morning 4

2
Math: MON Morning 1
Computer: FRI Afternoon 3

4 分析

水題。這種還好,我還記得紫書uva11210 麻將那道題,才是真的難受

題意,輸入課程時間,按格式輸出課程表
注意課程名稱居中,偶數在末尾新增空格
COURSE_NAME: DAY TIME_SECTION CLASS_NUMBER
只有課程名因為中間有特殊的空格需要處理一下
兩個記錄陣列,一個記錄是否在day class有課
一個記錄課名
上下午的處理:如果是下午直接+4
因為輸出 是按行,所以記錄陣列應該是[classnum][day]的形式

5 code


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;

string name[7][5];
bool exist[7][5];  
string tmp,tmp2;
char day[5],timesec[15];
int classnum,date,i,j,k,len,space;

int main(){
    while(cin>>n){
        memset(exist,0,sizeof(exist));
        while(n-->0){
            cin>>tmp;
            while(tmp[tmp.size()-1]!=':'){  //我傻了,可能有多個空格!! 一開始只寫了一個if
                cin>>tmp2;
                tmp=tmp+' '+tmp2;
            }
            tmp=tmp.substr(0,tmp.size()-1);
            scanf("%s %s",day,timesec); //注意空格
            scanf("%d",&classnum);
            if(timesec[0]=='A')
                classnum+=4;
            classnum--;
            if(day[1]=='O')
                date=0;
            else if(day[1]=='U')  //一開始少打一個=...
                date=1;
            else if(day[1]=='E')
                date=2;
            else if(day[1]=='H')
                date=3;
            else 
                date=4;
            exist[classnum][date]=true;
            name[classnum][date]=tmp;
            //cout<<classnum<<date<<tmp<<endl;
        }
        printf("+-----+-----------+-----------+-----------+-----------+-----------+\n"
			   "|     |    MON    |    TUE    |    WED    |    THU    |    FRI    |\n"
			   "+-----+-----------+-----------+-----------+-----------+-----------+\n"
			   "|                          Morning                                |\n"
			   "+-----+-----------+-----------+-----------+-----------+-----------+\n"
			   );
		for(i=0;i<4;i++){
			printf("|  %d  |",i+1);
			for(j=0;j<5;j++){
				if(exist[i][j]){
					len=name[i][j].size();
					if(!(len&1))
                        name[i][j]+=' ';
					space=(11-len)/2;
					for(k=0;k<space;k++)
					    printf(" ");
					cout<<name[i][j];
					for(k=0;k<space;k++)
					    printf(" ");
					printf("|");
				} 
				else
				printf("           |"); 
			}
			printf("\n");
			printf("+-----+-----------+-----------+-----------+-----------+-----------+\n");
		} 
		printf("|                         Afternoon                               |\n"
			   "+-----+-----------+-----------+-----------+-----------+-----------+\n");
		for(i=4;i<7;i++){
			printf("|  %d  |",i-3);
			for(j=0;j<5;j++){
				if(exist[i][j]){
					len=name[i][j].size();
					if(!(len&1))
                        name[i][j]+=' ';
					space=(11-len)/2;
					for(k=0;k<space;k++)
					    printf(" ");
					cout<<name[i][j];
					for(k=0;k<space;k++)
					printf(" ");
					printf("|");
				} 
				else
				printf("           |"); 
			}
			printf("\n");
			printf("+-----+-----------+-----------+-----------+-----------+-----------+\n");
		}
		printf("\n");
    }
    return 0;
}



/*網上的 c版,注意輸入處理回車
#include<cstdio>
#include<cstring>
using namespace std;

void input(char* s){
	int i=0;
	char c;
	getchar();  //回車的處理
	while(scanf("%c",&c)&&c!=':'){
		s[i]=c;
		i++;
	}
	s[i]='\0';
}

int main(){
	char cou[15],coutab[7][5][15],day[5],mon[10];
	int yntab[7][5];
	int i,j,k,l,len,dayi,n,cnum;
	while(scanf("%d",&n)==1){
		memset(yntab,0,35*sizeof(int));
		while(n-->0){
			input(cou);
			scanf("%s %s %d",&day,&mon,&cnum);
			if(!strcmp(day,"MON"))
			dayi=0;
			else if(!strcmp(day,"TUE"))
			dayi=1;
			else if(!strcmp(day,"WED"))
			dayi=2;
			else if(!strcmp(day,"THU"))
			dayi=3;
			else if(!strcmp(day,"FRI"))
			dayi=4;
			if(!strcmp(mon,"Morning"))
			cnum-=1;
			else
			cnum+=3;
			yntab[cnum][dayi]=1;
			strcpy(coutab[cnum][dayi],cou);
		}
		printf("+-----+-----------+-----------+-----------+-----------+-----------+\n"
			   "|     |    MON    |    TUE    |    WED    |    THU    |    FRI    |\n"
			   "+-----+-----------+-----------+-----------+-----------+-----------+\n"
			   "|                          Morning                                |\n"
			   "+-----+-----------+-----------+-----------+-----------+-----------+\n"
			   );
		for(i=0;i<4;i++){
			printf("|  %d  |",i+1);
			for(j=0;j<5;j++){
				if(yntab[i][j]){
					len=strlen(coutab[i][j]);
					if(!(len&1)){
						coutab[i][j][len]=' ';
						len++;
						coutab[i][j][len]='\0';
					}
					k=(11-len)/2;
					for(l=0;l<k;l++)
					printf(" ");
					printf("%s",coutab[i][j]);
					for(l=0;l<k;l++)
					printf(" ");
					printf("|");
				} 
				else
				printf("           |"); 
			}
			printf("\n");
			printf("+-----+-----------+-----------+-----------+-----------+-----------+\n");
		} 
		printf("|                         Afternoon                               |\n"
			   "+-----+-----------+-----------+-----------+-----------+-----------+\n");
		for(i=4;i<7;i++){
			printf("|  %d  |",i-3);
			for(j=0;j<5;j++){
				if(yntab[i][j]){
					len=strlen(coutab[i][j]);
					if(!(len&1)){
						coutab[i][j][len]=' ';
						len++;
						coutab[i][j][len]='\0';
					}
					k=(11-len)/2;
					for(l=0;l<k;l++)
					printf(" ");
					printf("%s",coutab[i][j]);
					for(l=0;l<k;l++)
					printf(" ");
					printf("|");
				} 
				else
				printf("           |"); 
			}
			printf("\n");
			printf("+-----+-----------+-----------+-----------+-----------+-----------+\n");
		}
		printf("\n");
	}
	return 0;
}
*/

title: woj1020 Adjacent Difference 排序
date: 2020-03-19 11:43:00
categories: acm
tags: [acm,woj,排序]

水題,排序

1 描述

An adjacent difference of a sequence is a new sequence formed by replacing every element with the difference between the element and the immediately preceding element. The first value in the new sequence remains unchanged. For example, a sequence such as (1, 3, 2, 4, 5) is transformed into (1, 3-1,2-3, 4-2, 5-4), and in this manner becomes the sequence (1, 2, -1, 2, 1). Then, we want to sort the adjacent difference of the sequence in non-decreasing order. It?s an easy job for you, isn?t it? So, please solve it quickly.

2 輸入輸出

輸入格式
Standard input will contain multiple test cases. The first line of the input is a single integer T(1 <= T <= 50) which is the number of test cases.

For each test case, the first line contains an integer N(1 <= N <= 1000), representing the size of the sequence. The second line contains

N integers (you are ensured that the absolute value of each integer is less than ), representing the elements of this sequence.

輸出格式
Results should be directed to standard output. Start each case with "Case #:" on a single line, where # is the case number starting from 1. Two consecutive cases should be separated by a single blank line. No blank line should be produced after the last test case.

For each test case, output one line containing n elements representing the sorted adjacent difference of the sequence. Elements are separated by one blank space.

3 樣例

樣例輸入
1
5
1 3 2 4 5
樣例輸出
Case 1:
-1 1 1 2 2

4 code

// 先計算差,再排序
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int T,S,tmp;
vector<int>nums;
vector<int>ans;
int main(){
    cin>>T;
    int casee=0;
    while(casee<T){
        nums.clear();
        ans.clear();  //每次清空
        if(casee!=0)
            cout<<endl;
        casee++;
        cin>>S;
        cin>>tmp;
        nums.push_back(tmp);
        ans.push_back(tmp);
        S--;
        while(S--)
        {
            cin>>tmp;
            nums.push_back(tmp);
            tmp=tmp-nums[nums.size()-2];
            ans.push_back(tmp);
        }
        sort(ans.begin(),ans.end());
        printf("Case %d:\n",casee);
        for(int i=0;i<nums.size()-1;i++){
            cout<<ans[i]<<' ';
        }
        cout<<ans[ans.size()-1]<<endl;
    }
    //system("pause");
    return 0;
}

// sort 自己寫快排
//list vector 陣列模擬list https://blog.csdn.net/stormdpzh/article/details/8836268
// 學習筆記 https://blog.csdn.net/stormdpzh