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;
}
}
}
我还是太水了..
但是菜鸡也要继续努力啊