CSP 2017-09

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;
        }
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值