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 }
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 }
7-11 重排链表
题意:给定一个单链表 L1→L2→⋯→Ln−1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln−1→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 }
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 }

浙公网安备 33010602011771号