QFNU 10-02 19 training

B - Yet Another Crosses Problem

题意:找如果使图中某一行某一列全部变成黑色,至少需要把多少个白方格变成黑方格

思路:直接找就可以,注意存储的时候要记得进行分开存储,存储每一行多少个白方格用一个数组,存储每一列多少个白方格用一个数组,最后再进行判断最少的是多少

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<cstdio>
 6 using namespace std;
 7 const int maxx=50010;
 8 
 9 
10 int main(){
11     int t;
12     scanf("%d",&t);
13     while(t--){
14         int n,m;
15         scanf("%d %d",&n,&m);
16         int a[n][m];
17         int b[n+11]={0};
18         int c[m+11]={0};
19         char s;
20         for(int i=0;i<n;i++){
21              getchar();
22             for(int j=0;j<m;j++){
23                 scanf("%c",&s);
24                 if(s=='*'){
25                     a[i][j]=0;
26 
27                 }else{
28                     a[i][j]=1;
29                     b[i]++;
30                     c[j]++;
31                 }
32 
33             }
34 
35         }
36         int minn=9e6;
37         for(int i=0;i<n;i++){
38             for(int j=0;j<m;j++){
39                 int s=b[i]+c[j]-a[i][j];
40                 minn=min(minn,s);
41             }
42 
43         }
44         printf("%d\n",minn);
45 
46 
47     }
48 }
View Code

 

7-9 排座位

题意:布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。

思路:输入的i号宾客和j号宾客对应某种关系,就用一个数组的第i行第j列存入其对应关系,第j行第i列存入其对应关系,当查找其关系时进行数组遍历寻找,找其所在行所在列是否存在1或者-1,进行查找其关系,一定主意判断条件应该是相乘为1,并不是两个都为1,

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<cstdio>
 6 using namespace std;
 7 int main(){
 8     int n,m,k;
 9     scanf("%d %d %d",&n,&m,&k);
10     int a[n+2][n+2]={0};
11     for(int i=0;i<m;i++){
12         int h,l,num;
13         scanf("%d %d %d",&h,&l,&num);
14         a[h][l]=num;
15         a[l][h]=num;
16     }
17     while(k--){
18         int num1,num2;
19         scanf("%d %d",&num1,&num2);
20         if(a[num1][num2]==1){
21             printf("No problem\n");
22         }else if(a[num1][num2]==0){
23             printf("OK\n");
24         }else{
25             int flag=0;
26             for(int i=0;i<n;i++){
27                 if(a[num1][i]*a[num2][i]==1){//一定注意
28                     flag=1;
29                 }
30             }
31             if(a[num1][num2]==0&&flag==1){
32                 printf("No problem\n");
33             }else if(a[num1][num2]==0&&flag==0){
34                 printf("OK\n");
35             }else if(a[num1][num2]==-1&&flag==1){
36                 printf("OK but...\n");
37             }else{
38                 printf("No way\n");
39             }
40         }
41     }
42 }
View Code

 

7-11 重排链表

题意:给定一个单链表 L1​​→L2​​→⋯→Ln1​​→Ln​​,请编写程序将链表重新排列为 Ln​​→L1​​→Ln1​​→L2​​→⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。

思路:需要开设两个结构体,一个讲address作为存储的下标,然后通过这样存储以后,再进行开设第二个同类型的结构体,进行存入,主要是从第一个结构体的顺序上添加了他们的相对位置序号,输出的时候也要进行分开输出,不要两个两个的输出,就直接一个一个输出分开奇偶位置的数就好,不然还要分奇偶进行输出,就很麻烦

注意:1.存储的时候,看着样例以为data位置上就是他们的相对位置,直接进行这样输出了,结果就是错的,数据没有特殊性;2.数据输出的时候不要固化直接两个两个输出,一个一个分开奇偶位进行输出也好;3.用一个新的n更新结构体中链表的长度,因为会存在多余结点,导致出现很多的-1等等问题

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 const int maxx=1e5+2;
 8 struct num{
 9     int address,data,next,numm;
10 }point[maxx],ss[maxx];
11 bool cmp(num& a,num& b){
12     return a.numm<b.numm;
13 }
14 int main(){
15     int start,n;
16     scanf("%d %d",&start,&n);
17     int p;
18     for(int i=0;i<n;i++){
19         scanf("%d",&p);
20         scanf("%d %d",&point[p].data,&point[p].next);
21     }
22     p=start;
23     int i=1;
24     int sum=0;
25     while(p!=-1){
26         ss[i].address=p;
27         ss[i].data=point[p].data;
28         ss[i].next=point[p].next;
29         i++;
30         p=point[p].next;
31         sum++;
32     }
33 
34     int j=0;
35     int left=1,right=sum;
36     while(sum--){
37         j++;
38         if(j%2==1){
39             if(sum!=0){
40                 printf("%05d %d %05d\n",ss[right].address,ss[right].data,ss[left].address);
41                 right--;
42             }else{
43                 printf("%05d %d -1\n",ss[right].address,ss[right].data);
44 
45             }
46 
47         }else{
48             if(sum!=0){
49                 printf("%05d %d %05d\n",ss[left].address,ss[left].data,ss[right].address);
50                 left++;
51             }else{
52                 printf("%05d %d -1\n",ss[left].address,ss[left].data);
53             }
54 
55         }
56     }
57 }
View Code

 

7-12 分而治之

题意:分而治之,各个击破是兵家常用的策略之一。在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序,判断每个方案的可行性。(其实就是找所给点是否可以遍历完所有的马路)

思路:进行结构体存储输入的一条路对应的两个城市,用数组中0.1去重的相似方法进行查找,所给攻破城市存入一个新的数组中,然后用结构体中的两个城市比较看是否两个城市都为初始值0

注意:1.一开始的时候用二维数组进行存储路线,后来因为循环太多出现了段错误;2.此题应该用已知去比较,而不是用所给攻破城市和已知去比较,因为此时的攻破城市已经在同一层面上,也就是都存入了一个一维数组中,不用逐个去比较

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 const int maxx=1e4+6;
 8 struct point{
 9     int a,b;
10 }p[maxx];
11 int main(){
12     int n,m;
13     scanf("%d %d",&n,&m);
14     for(int i=0;i<m;i++){
15         scanf("%d %d",&p[i].a,&p[i].b);
16     }
17     int np;
18     scanf("%d",&np);
19     while(np--){
20         int k;
21         int c[maxx]={0};
22         scanf("%d",&k);
23         int v;
24         for(int i=0;i<k;i++){
25             scanf("%d",&v);
26             c[v]=1;
27         }
28         int flag=0;
29         for(int i=0;i<m;i++){
30             if(c[p[i].a]==0&&c[p[i].b]==0){
31                 flag=1;
32             }
33         }
34         if(flag==1){
35             printf("NO\n");
36         }else{
37             printf("YES\n");
38         }
39     }
40 }
View Code

 

posted @ 2020-10-11 19:27  bonel  阅读(103)  评论(0)    收藏  举报