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;}
}
}
来源:oschina
链接:https://my.oschina.net/u/4277979/blog/4671447