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(" %05d\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("%05d ", End);
cout<<points[End].num;
// cout<<setw(5)<<Head<<endl;
printf(" %05d\n", Head);
//改變End值
End=points[End].front;
if(Head==End)
{
break;
}
//再輸出第一個
//cout<<setw(5)<<Head<<" ";
printf("%05d ", Head);
cout<<points[Head].num;
//cout<<setw(5)<<End<<endl;
printf(" %05d\n", End);
//改變Head值
Head=points[Head].next;
}
//cout<<setw(5)<<Head<<" ";
printf("%05d ", 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;}
}
}