天梯赛 1

    科技2022-08-28  93

    7-6 情人节 思路: 1.用while()循环 while(cin>>t) 找到第二号点赞者和第十四号点赞者 2.用点赞者的个数列出三种情况 3.注意一定要排除 t = ’ .’ 的情况 输入t的时候,不要在while()循环外面输入,直接写在while内部 用 while(cin >> t)(之前写在外面的时候一直部分正确)

    #include<bits/stdc++.h> #define ll long long #define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; int main() { string t; string t2,t14; int i=0; while(cin>>t) { if(t==".") { break; } i++; if(i==2) { t2=t; } if(i==14) { t14=t; } } if(i<2) { cout<<"Momo... No one is for you ..."<<endl; } else if(i<14) { cout<<t2<<" is the only one for you..."<<endl; } else if(i>=14) { cout<<t2<<" and "<<t14<<" are inviting you to dinner..."<<endl; } }

    7-9 排座位 思路: 一开始我是想用vector< string > 来把所有已知的人的朋友和敌人都装进数组里,但是一直改到最后都是部分正确 后来看了队里大佬的新思路: 1.定义一个二维数组 ret[a][b] 来装a和b的关系就是数组这个位置对应的值-1或1 2.如果要判断的这两个人是敌人 就要遍历数组用if(ret[j][a]*ret[j][b]==1) 看他们是否有共同的朋友

    #include<bits/stdc++.h> #define ll long long #define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; int ret[101][101]={0};//初始化 int main() { int n,m,k,i,j; cin>>n>>m>>k; while(m--) { int a,b; int t; cin>>a>>b>>t; ret[a][b]=t; ret[b][a]=t; } while(k--) { int a,b; cin>>a>>b; //敌人 if(ret[a][b]==-1) { int flag=0; //遍历,看看有没有相同的朋友 for(int j=1;j<=n;j++) { if(ret[j][a]*ret[j][b]==1) { flag=1; break;//有相同的朋友 } } if(flag)cout<<"OK but..."<<endl; else cout<<"No way"<<endl; } //朋友和陌生人 else if(ret[a][b]==0) { cout<<"OK"<<endl; } else if(ret[a][b]) { cout<<"No problem"<<endl; } } }

    7-11 重排链表 思路: 这个用结构体就可以做,之前用指针做过一个很类似的题 1.定义一个结构体,里面有对应的值,和前面一个数和后面一个数的位置 2.按要求顺序输出的时候可以通过最头上的Head和最末尾的End来遍历整个数组从而输出,输出的时候要注意先输出后面指向的,再输出前面指向的 3.输出的时候 可以用:printf(" d\n", Head);(有规定的宽度而且可以补0) 不能用:cout<<setw(5)<<Head<<endl;(会有规定的宽度但是不会补0)

    #include<bits/stdc++.h> #define ll long long #define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; const int N = 100000 + 5; //定义一个结构体 struct point { string num; int next; int front; }points[N]; int main() { int Head;//头 int n; cin>>Head>>n; int End;//尾 //输入 for(int i=0;i<n;i++) { int head,next; string num; cin>>head>>num>>next; points[head].num=num; points[head].next=next; //判断是否是最后一个值End if(next!=-1) { points[next].front=head; } else { End=head; } } //开始从新排序后输出 //移动Head和End指针 while(Head!=End) { //先输出后一个 //cout<<setw(5)<<End<<" "; printf("d ", End); cout<<points[End].num; // cout<<setw(5)<<Head<<endl; printf(" d\n", Head); //改变End值 End=points[End].front; if(Head==End) { break; } //再输出第一个 //cout<<setw(5)<<Head<<" "; printf("d ", Head); cout<<points[Head].num; //cout<<setw(5)<<End<<endl; printf(" d\n", End); //改变Head值 Head=points[Head].next; } //cout<<setw(5)<<Head<<" "; printf("d ", Head); cout<<points[Head].num; cout<<" -1"<<endl; return 0; }

    7-12 分而治之 思路: 大体就是看攻下了要攻下的那些城市之后,每个城市是不是都是孤立的 1.把相互之间有路的城市存入数组 2.把要攻下的城市存入set 3.在set之中寻找数组中的值,只要成对的里面有一个在set之中这条路就断了,所以如果数组中的值全部在set里就Yes,否则就No

    #include<bits/stdc++.h> #include<algorithm> #define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; const long long N=1e4+7; long long city[N][2]; int main() { long long n,m,i; cin>>n>>m; //输入 //把相互之间有路的城市存入 for(i=0;i<m;i++) { cin>>city[i][0]; cin>>city[i][1]; } long long k,j; cin>>k; while(k--) { int flag=0; set<int> s; //也可以用vector<int> long long t; cin>>t; for(i=0;i<t;i++) { long long c; cin>>c; s.insert(c); } //在s里找数组里的各个值 //成对存在的只要有一个有就可以了 for(i=0;i<m;i++) { if(s.find(city[i][0])==s.end()&&s.find(city[i][1])==s.end()) { flag=1; break; } } if(flag==1){cout<<"NO"<<endl;} else if(flag==0){cout<<"YES"<<endl;} } }
    Processed: 0.013, SQL: 9