CSP 2017-09

来源:互联网 发布:qq三国90js单刷孟获 编辑:程序博客网 时间:2024/06/06 15:29

0-0

个人感觉这次题目后两道有点偏难..并没有找到合适的方法..最后一道没有尝试线段树 但估计也会TLE
C语言感觉写起来好慢啊.. 比起c++很多东西都要自己写(一定是我太弱了..

一 100

#include<stdio.h>int main(){    int N;    int count;    while(~scanf("%d",&N)){        count = 0;        N = N / 10;        count = N + (N / 5) * 2 + (N % 5 / 3);        printf("%d\n",count);    }    return 0;}

二 100

#include<stdio.h>int cmp(void const *, void const *);int getMin(int ,int );void Keyback(int );void Keylend(int );struct node{    int key_num;    int begin_time;    int end_time;}key[10001];int key_time[1001];//还钥匙的时间int key_local[1001];//钥匙的位置int N,K;int Judge;//借钥匙还是还钥匙int main(){    int i;    int s,c,v;    int req_count,wait_count;    int min_time;//操作时间    while(~scanf("%d %d",&N,&K)){        for(i = 0; i <= N; i++){            key_time[i] = 0;            key_local[i] = i;        }        for(i = 0; i < K; i++){            scanf("%d %d %d",&s,&c,&v);            key[i].key_num = s;            key[i].begin_time = c;            key[i].end_time = v + c;        }        qsort(key,K,sizeof(key[0]),cmp);        req_count = 0;//剩余的请求数目        wait_count = 0;//要还的钥匙数目        while(req_count != K || wait_count != 0){            min_time = getMin(req_count,wait_count);//获取钥匙和借钥匙中较小的时间            //还钥匙            if(Judge == 1){                Keyback(min_time);                wait_count--;            }            //借钥匊           else{                Keylend(req_count);                req_count++;                wait_count++;            }        }        printf("%d",key_local[1]);        for(i = 2; i <= N; i++) printf(" %d",key_local[i]);        printf("\n");    }    return 0;}void Keyback(int min_time){    int i;    int backnum;    for(backnum = 0; key_time[backnum] != min_time; backnum++);    key_time[backnum] = 0;//找到钥匙    for(i = 1; i <= N; i++){        if(key_local[i] == 0){            key_local[i] = backnum;            return;        }    }//还入柜中}void Keylend(int req_count){    int key_number1,key_number2;    int key_endtime;    //取出钥匙    key_number1 = key[req_count].key_num;    key_endtime = key[req_count].end_time;    for(key_number2 = 1; key_local[key_number2] != key_number1; key_number2++);    key_local[key_number2] = 0;    //定义等待时间    key_time[key_number1] = key_endtime;}int cmp(const void *a, const void *b){    struct node *c = (struct node *) a;    struct node *d = (struct node *) b;    if(c->begin_time != d->begin_time) return c->begin_time - d->begin_time;    else if(c->end_time != d->end_time) return c->end_time - d->end_time;    else return c->key_num - d->key_num;}int getMin(int req_count, int wait_count){    int i;    int min1;    min1 = key[req_count].begin_time;    Judge = 0;    if(req_count == K){        min1 = 20000;        for(i = 1; i <= N; i++){            if(key_time[i] != 0 && key_time[i] < min1){                min1 = key_time[i];                Judge = 1;            }        }        return min1;    }    if(wait_count == 0);    else{        for(i = 1; i <= N; i++){            if(key_time[i] != 0 && key_time[i] <= min1){                min1 = key_time[i];                Judge = 1;            }        }    }    return min1;}

三 90

#include<stdio.h>struct node{    char key[100];    int judge;    char value[100];}data[100];int count;//总的数据char sign[100];//标志符int sign_count;char key[100];//属性int key_count;char value[100];//值int value_count;int select;void handle_date(char *);void search_date(char *);void insert_object();void insert_class();int main(){    int n,m;    char date[100];    while(~scanf("%d %d",&n,&m)){        //init        getchar();        select = count = sign_count = key_count = value_count = 0;        while(n--){            gets(date);            handle_date(date);        }        insert_class();        while(m--){            gets(date);            search_date(date);        }    }    return 0;}void handle_date(char *date){    int i = 0;    while(date[i]){        if(date[i] == '{'){            if(sign_count == 0) sign[sign_count++] = '{';            else{                if(sign[sign_count-1] == ':'){                    select = 0;                    sign[sign_count-1] = '{';                    insert_object();                }else if(sign[sign_count-1] == '"'){                    if(select == 0) key[key_count++] = '{';                    else value[value_count++] = '{';                }            }        }else if(date[i] == ' ' || date[i] == '\n');        else if(date[i] == '"'){            if(sign[sign_count-1] == '"'){//sign finish                select = 1;                sign_count--;//sign delete            }else if(sign[sign_count-1] == '{'){                select = 0;                sign[sign_count++] = '"';//sign insert            }else if(sign[sign_count-1] == '\\'){                if(select == 0) key[key_count++] = '"';                else value[value_count++] = '"';                sign_count--;            }else if(sign[sign_count-1] == ':'){                select = 1;                sign[sign_count-1] = '"';            }        }else if(date[i] == ','){            if(sign[sign_count-1] == '"'){                if(select == 0) key[key_count++] = ',';                else value[value_count++] = ',';            }else if(sign[sign_count-1] == '{'){                insert_class();            }else if(sign[sign_count-1] == '}'){                insert_class();                key_count = key_count - 2;                while(key[key_count] != '.' && key_count > 0) key_count--;                sign_count = sign_count - 2;            }        }else if(date[i] == '\\'){            if(sign[sign_count-1] == '\\'){                if(select == 0) key[key_count++] = '\\';                else value[value_count++] = '\\';                sign_count--;            }else if(sign[sign_count-1] == '"') sign[sign_count++] = '\\';        }else if(date[i] == ':'){            if(sign[sign_count-1] == '"'){                if(select == 0) key[key_count++] = ',';                else value[value_count++] = ',';            }else sign[sign_count++] = ':';        }else if(date[i] == '}') sign[sign_count++] = '}';        else{            if(select == 0) key[key_count++] = date[i];            else value[value_count++] = date[i];        }        i++;    }}void search_date(char *date){    int i;    for(i = 0; i < count; i++){        if(strcmp(date,data[i].key) == 0){            if(data[i].judge == 1) printf("OBJECT\n");            else printf("STRING %s\n",data[i].value);            break;        }    }    if(i == count) printf("NOTEXIST\n");}void insert_object(){    int i;    for(i = 0; i < key_count; i++){        data[count].key[i] = key[i];    }    data[count].key[i] = '\0';    data[count].judge = 1;    count++;    key[key_count++] = '.';}void insert_class(){    int i;    for(i = 0; i < key_count; i++){        data[count].key[i] = key[i];    }    data[count].key[i] = '\0';    data[count].judge = 0;    for(i = 0; i < value_count; i++){        data[count].value[i] = value[i];    }    data[count].value[i] = '\0';    count++;    while(key[key_count] != '.' && key_count > 0) key_count--;    if(key[key_count] == '.') key_count++;    value_count = 0;}

四 65 100

最后两道还是没有想好要怎么做
第四个看到感觉用并查集 但是是有向图又不知道怎么下手了 最后用Floyd算法 65

#include<stdio.h>int result[1001][1001];int n;int main(){    int num1,num2;    int i,j,k,m;    int count;    while(~scanf("%d %d",&n,&m)){        count = 0;        for(i = 0; i < n; i++){            for(j = 0; j < n; j++)  result[i][j] = 0;        }        while(m--){            scanf("%d %d",&num1,&num2);            result[num1-1][num2-1] = 1;        }        for(i = 0; i < n; i++){            for(j = 0; j < n; j++){                if(result[j][i] == 1){                    for(k = 0; k < n; k++){                        result[j][k] = result[j][k] | (result[i][k] & result[j][i]);                    }                }            }        }        for(i = 0; i < n; i++){            for(j = 0; j < n; j++){                if(i == j) continue;                if(result[i][j] == 0 && result[j][i] == 0) break;            }            if(j == n) count++;        }        printf("%d\n",count);    }    return 0;}

更新!!!!
使用两个bfs时间复杂度相比之前会减少很多,解决

#include<stdio.h>void dfs(int, char *, int);int map[1005][1005];int edge[1005][1005];int main(){    int i,j;    int N,M;    int begin,end;    int visit[1005];    int result;    while(~scanf("%d %d",&N,&M)){        result = 0;        for(i = 0; i <= N; i++){            for(j = 0; j <= N; j++) map[i][j] = edge[i][j] = 0;        }        for(i = 0; i < M; i++){            scanf("%d %d",&begin,&end);            edge[begin][++edge[begin][0]] = end;        }        for(i = 1; i <= N; i++){            for(j = 0 ; j <= N; j++) visit[j] = 0;            dfs(i,visit,i);        }        for(i = 1; i <= N; i++){            for(j = 1; j <= N; j++){                if(map[i][j] | map[j][i]);                else break;            }            if(j == N+1) result++;        }        printf("%d\n",result);    }    return 0;}void dfs(int i, char *visit, int j){    int n;    map[i][j] = map[j][i] = 1;    visit[j] = 1;    for(n = 1; n <= edge[j][0]; n++){        if(visit[edge[j][n]] == 0){            dfs(i,visit,edge[j][n]);        }    }}

五 最后一个题..

用线段树的话可能效果会更好 直接暴力解只有30…

#include<stdio.h>void data_div(int ,int ,int);void data_add(int ,int );int data[100005];int result1,result2;int main(){    int i;    int N,M;    int judge,l,r,v;    while(~scanf("%d %d",&N,&M)){        for(i = 0; i < N; i++) scanf("%d",&data[i]);        for(i = 0; i < M; i++){            scanf("%d",&judge);            result1 = result2 = 0;            if(judge == 1){                scanf("%d %d %d",&l,&r,&v);                data_div(l-1,r,v);            }else if(judge == 2){                scanf("%d %d",&l,&r);                data_add(l-1,r);                if(result1 == 0) printf("%d\n",result2);                else printf("%d%d\n",result1,result2);            }        }    }    return 0;}void data_div(int l, int r, int v){    int i,count;    for(;l < r; l++){        if(data[l] < v) continue;        for(count = data[l], i = 0; count > 0; count = count - v, i++);        if(count == 0) data[l] = i;//      if(data[l] % v == 0) data[l] = data[l] / v;    }}void data_add(int l, int r){    for(;l < r; l++){        result2 += data[l];        if(result2 > 100000000){            result2 = result2 - 100000000;            result1 = result1 + 1;        }    }}

我还是太水了..
但是菜鸡也要继续努力啊