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; } }}
我还是太水了..
但是菜鸡也要继续努力啊
阅读全文
0 0
- CSP 2017-09
- CSP 2017-03
- csp 2017_3_3 markdown
- CSP
- CSP
- 2017/4/3 csp-Markdown
- csp-2017-3 分蛋糕
- csp-2017-3 学生排队
- CSP 2017_9_4 通信网络
- CSP 火车购票 2016 09 2
- CCF-CSP-2017-3-1 分蛋糕
- CCF-CSP-2017-3-2 学生排队
- csp ccf 2017 3修地铁问题
- CCF-CSP 交通规划 JAVA 2016-09-04 100分
- CSP review
- CSP++ 计划书
- 入手csp
- WEB CSP
- Unity3d鼠标拖拽物体实现任意角度自旋转
- 697. Degree of an Array
- springmvc事务控制批量插入多张表格
- @Generated源码翻译
- Spring Cloud Config-Git后端
- CSP 2017-09
- WPS2013开发工具中的VBA为灰色不可用状态的解决方法
- Deep Learning回顾之LeNet、AlexNet、GoogLeNet、VGG、ResNet
- 聚沙成塔--爬虫系列(四)(爬取糗事百科段子)
- Prolog教程
- Swing中菜单栏JToolBar的使用
- Android系统音量
- WPS文字教你制作米字本即用于临摹练字的米字格
- html或jsp页面Echarts使用js/jq获取后台参数