CSP2014-09

  CSP201409-1 相邻数对

 

 

 

水题yyds ,要不是今天卡死在了201403-03题上我怎么会来拿水题出气,害

 1 //
 2 //  main.cpp
 3 //  CSP201409-1 相邻数对
 4 //
 5 //  Created by sylvia on 2021/10/15.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 #include <algorithm>
10 #include <iostream>
11 using namespace std;
12 int main(){
13     int n,i,ans=0;
14     cin>>n;
15     int a[n];
16     for (i=0;i<n;++i){
17         cin>>a[i];
18     }
19     sort(a,a+n);
20     for(i=0;i<n-1;++i){
21         if(a[i+1]-a[i]==1) ans++;
22     }
23     cout<<ans<<endl;
24     return 0;
25 }
View Code

 

  CSP201409-2画图

 

 

 

 

 

 

出气题第二题,2014-03明日再战

 1 //
 2 //  main.cpp
 3 //  CSP201409-2画图
 4 //
 5 //  Created by sylvia on 2021/10/15.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <string.h>
11 using namespace std;
12 #define MAX 100+2
13 
14 int main(){
15     int n,x,y,a,b,ans[MAX][MAX],res=0;;
16     cin>>n;
17     memset(ans,0,sizeof(ans));
18     
19     for (int i=0;i<n;i++){
20         cin>>x>>y>>a>>b;
21         for (int j=x+1;j<=a;j++){
22             for (int k=y+1;k<=b;k++){
23                 ans[j][k]=1;
24             }
25         }
26     }
27     for (int i=1;i<=100;i++){
28         for (int j=1;j<=100;j++){
29             res+=ans[i][j];
30         }
31     }
32     cout<<res<<endl;
33     return 0;
34 }
View Code

 

  CSP201409-3 字符串匹配

 

 

 

 

 

   仍然水题,但是我被字符串搞怕了qwq,每次遇到字符串,读入上我就败了orzzzz

  使用strlwr转换为小写,使用strstr查找子串

  列一下相关函数:

1.strstr():检索子串在字符串中首次出现的位置

  原型:char *strstr( char *str, char * substr );

  如未出现返回NULL

  头文件:#include<string.h>

 

2.strlwr():将字符串str中的大写字母转换为小写

  原型:char *strlwr(char *str);

  直接改变str串

  头文件:#include <string.h>

 

3.strupr():将字符串s转换为大写形式

原型:char *strupr(char *str);

头文件:#include <string.h>

 

4.tolower():把给定的字母转换为小写字母

  原型:int tolower(int c) 

  只能转换单个字符,返回小写字母

  头文件:#include <ctype.h>

 

4.toupper():把给定的字母转换为大写字母

  原型:int tolupper(int c) 

  只能转换单个字符,返回大写字母

  头文件:#include <ctype.h>

另外一些查找函数:https://www.cnblogs.com/kmist/p/10099867.html

 1 //
 2 //  main.cpp
 3 //  CSP201409-3 字符串匹配
 4 //
 5 //  Created by sylvia on 2021/10/16.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <string.h>
11 
12 using namespace std;
13 #define N 100+2
14 char str[N],line[N],line2[N];
15 
16 int main(){
17     int a,n;
18     cin>>str;
19     cin>>a>>n;
20     if(!a) strlwr(str);
21     for (int i=1;i<=n;i++){
22         cin>>line;
23         strcpy(line2,line);
24         if(!a) strlwr(line);
25         if(strstr(line,str)) cout<<line2<<endl;
26     }
27     return 0;
28 }
View Code

 

  CSP201409-4 最优配餐

 

 

 

 

 

经典dfs(多源最短路)

复习dfs戳这里 

dfs解决两类问题:

第一类问题:从节点A出发,有前往节点B的路径吗?
第二类问题:从节点A出发,前往节点B的哪条路径最短?

以栋栋的分店为起点,客户为目标点,求每个客户到分店的最短距离,若以客户为起点搜索,则对于每一个客户都要进行一次搜索,单次搜索的时间复杂度为O(n2),则总的时间复杂度O(n4)。
换个思路,我们假设存在一个超级远点,这个超级远点与每个分店的距离为0,即将分店加入队列,对其进行bfs,谁先搜索到客户算谁的

这里学习到了结构体内构造函数进行初始化,以及第一次使用stl里面的队列,果然好用,以下几个常用函数

  • front():返回 queue 队列头
  • back():返回 queue 队列尾
  • push(obj):加入队列
  • pop():出队
  • size():队列长度
  • empty():判断是否队空,空为true
 1 //
 2 //  main.cpp
 3 //  CSP201409-4 最优配餐
 4 //
 5 //  Created by sylvia on 2021/10/20.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <algorithm>
11 #include <stdio.h>
12 #include <queue>
13 #include <string.h>
14 using namespace std;
15 #define MAX 1000+5
16 #define LL long long
17 int cnt[MAX][MAX];
18 int vis[MAX][MAX];
19 LL ans=0;
20 int n,m,k,d;
21 struct node{
22     int x,y,t;
23     node(int xx,int yy,int tt=0):x(xx),y(yy),t(tt){}  //初始化
24 };
25 
26 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
27 int main(){
28     register int a,b,num;
29     memset(vis,0,sizeof(vis));
30     memset(cnt,0,sizeof(cnt));
31     cin>>n>>m>>k>>d;
32     queue<node> q;
33     while(m--){
34         cin>>a>>b;
35         q.push(node{a,b});
36         vis[a][b]=1;   //加入队列
37         
38     }
39     while(k--){
40         cin>>a>>b>>num;
41         cnt[a][b]+=num;  //送餐数
42     }
43     while(d--){
44         cin>>a>>b;
45         cnt[a][b]=-1;  //走不通
46     }
47     while (!q.empty()){
48         node v=q.front();  //取d头元素
49         q.pop();  //出队
50         if(cnt[v.x][v.y]>0){ //如果到了客户点
51             ans+=(LL)cnt[v.x][v.y]*v.t;
52         }
53         for (int i=0;i<4;++i){ //四个方向
54             int tx=v.x+dir[i][0];
55             int ty=v.y+dir[i][1];
56             //可以走并未走过
57             if(tx>0&&tx<=n&&ty>0&&ty<=n&&!vis[tx][ty]&&cnt[tx][ty]!=-1){
58                 q.push(node{tx,ty,v.t+1});
59                 vis[tx][ty]=1;  //打标记
60             }
61         }
62         
63     }
64     cout<<ans<<endl;
65     return 0;
66     
67 }
View Code

 

posted @ 2021-10-15 20:46  Sylvia_lee  阅读(109)  评论(0)    收藏  举报