7-6 帅到没朋友
题解:
这个题大体就是判断一下有哪几个人是不在朋友圈的
但是之前比赛的时候用的方法一直超时
用的set判断,基本就是嵌套两个for循环感觉也不是很多,但就是超时
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
set<string> s;
while(n--)
{
int k;
cin>>k;
if(k>1)
{
string t;
while(k--)
{
cin>>t;
s.insert(t);
}
}
else
{
while(k--)
{
string t;
cin>>t;
}
}
}
int m;
vector<string> v;
cin>>m;
while(m--)
{
string t;
cin>>t;
int falg=0;
for(auto it=s.begin();it!=s.end();it++)
{
if(t==*it)
{
falg=1;
break;
}
}
if(falg==0)
{
v.push_back(t);
}
}
vector<string> v1;
for(int j=0;j<v.size();j++)
{
int falg1=1;
for(int i=0;i<v1.size();i++)
{
if(v[j]==v1[i])
{
falg1=0;
break;
}
}
if(falg1==1)
{
v1.push_back(v[j]);
}
}
if(v1.size()==0)
{
cout<<"No one is handsome"<<endl;
}
if(v1.size()>0)
{
cout<<v1[0];
for(int i=1;i<v1.size();i++)
{
cout<<" "<<v1[i];
}
cout<<endl;
}
}
后来看队里大佬的代码改用普通的数组,就不超时了,按照大佬的思路打的
也相当于用了set,不会存在两个重复的情况,超级巧妙
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100000];
int main()
{
int n,m,b,k,i,j;
cin>>n;
for(i=0; i<n; i++)
{
cin>>m;
for(j=0; j<m; j++)
{
cin>>b;
if(m!=1)
{
a[b]=1;
}
}
}
cin>>m;
int flag=0;
for(i=0; i<m; i++)
{
cin>>b;
if(flag==0)
{
if(a[b]!=1)
{
printf("%05d",b);
a[b]=1;
flag=1;
}
}
else
{
if(a[b]!=1)
{
printf(" %05d",b);
a[b]=1;
}
}
}
if(flag==0)
{
cout<<"No one is handsome"<<endl;
}
return 0;
}
7-10 悄悄关注
题解:这个题其实挺简单的,但是一如既往地超时,一遇到string用set的情况我就超时
超时代码
#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;
struct people
{
string name;
int num;
};
people p[10000];
int main()
{
speed_up;
int n;
cin>>n;
vector<string> t;//关注
for(int i=0;i<n;i++)
{
string t1;
cin>>t1;
t.push_back(t1);
}
int m;
cin>>m;
double sum=0;
for(int i=0;i<m;i++)
{
cin>>p[i].name;
cin>>p[i].num;
sum=sum+p[i].num;
}
sum=sum/m;
vector<string> t2;
for(int i=0;i<m;i++)
{
if(p[i].num>sum)
{
t2.push_back(p[i].name);
}
}
sort(t2.begin(),t2.end());
int sum1=0;
for(int i=0;i<t2.size();i++)
{
int k=1;
for(int j=0;j<t.size();j++)
{
if(t2[i]==t[j])
{
k=0;
break;
}
}
if(k==1)
{
cout<<t2[i]<<endl;
sum1=1;
}
}
if(sum1==0)
{
cout<<"Bing Mei You"<<endl;
}
}
后来看队里大佬写的代码用的map更简单,照着他们的思路打的,以后遇到string 的题就少用set多用普通数组和map
不用map的话可能就要定义一个结构体来存放,用map就可以直接存放
#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()
{
speed_up;
int n;
cin>>n;
map<string,int>mp;
for(int i=0; i<n; i++)
{
string a;
cin>>a;
mp[a]++;
}
int m;
cin>>m;
string s[m];
int k[m];
double sum=0;
for(int i=0; i<m; i++)
{
string a;
cin>>a>>k[i];
sum+=k[i];
s[i]=a;
if(mp[a]!=1)mp[a]=k[i];
}
sum/=m;
int f=0;
for (auto it = mp.begin(); it != mp.end(); it++)
{
if(it->second>sum)
{
cout<<it->first<<endl;
f=1;
}
}
if(f==0)cout<<"Bing Mei You"<<endl;
}
7-11 彩虹瓶
这个题当时没什么思路时间也不太够了,后期看的大佬的代码
模拟装箱过程,货架看成栈
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int N,M,K,num,start,flag;
cin >> N >> M >> K;
for(int i=0;i<K;i++)
{
stack<int> st;
start = 1;flag=1;
for(int j=0;j<N;j++)
{
cin >> num;
if(num!=start) st.push(num);
//如果搬来的这箱小球不是可以装填的颜色,就把箱子先码放在一个临时货架上
else start++;
//如果搬来的这箱小球正好是可以装填的颜色,就直接拆箱装填
//当一种颜色装填完以后
while(!st.empty()&&st.top()<=start)
{ //先看看货架顶端的一箱是不是下一个要装填的颜色,如果是就取下来装填,否则去工厂里再搬一箱过来
st.pop();
start++;
}
if(st.size()>M) flag=0;
}
if(flag&&st.empty()) cout << "YES"<<endl;
else cout << "NO"<<endl;
}
return 0;
}