排序
特殊排序,不太懂啊。。为什么答案是这么写的,直接把最后一个不输出,难道不是把所有等于该值的数去除吗?
?
#include<iostream>
#include<algorithm>
using namespace std;
int a[1005];
int main()
{
int n;
//scanf("%d",&n)!=EOF或者写cin>>n 都能AC
while(scanf("%d",&n)!=EOF)//之前不小心写成NULL或者不加。就输出超限???
{
for(int i=0; i<n; i++)
cin>>a[i];
sort(a,a+n);
cout<<a[n-1]<<endl;
if(n==1)
{
cout<<-1<<endl;//忘记换行 。。
continue;
}
for(int i=0; i<n-1; i++)
{
//if(a[i]!=a[n-1])//为什么写上是错的啊??
printf("%d ",a[i]);
}
cout<<endl;
}
return 0;
}
- scanf("%d",&n)!=EOF或者写cin>>n 都能AC,如果只写scanf("%d",&n),会输出超限,也注意不要写成!=NULL
全程用的C++,超时了想一想,nlogn的算法1e5也不会超时啊。。算了一下:log2 1e6才≈20。。所以说,算法本身不会超时,真的就是IO超时了?所以下次再遇到这种大规模IO的,刚开始直接就用C,尤其是的输出,不然现在string还要用c_str()表示指针,有点乱
- scanf string,要:首先str.resize(10); 然后scanf("%s" ,&str[0]);
- printf string,要:printf("%s", str.c_str());
- printf 效率比cout 快很多,cout直接TLE。用printf的情况下,scanf 156ms,cin 276ms,所以用C的IO吧
- 如果用字符数组也OK,IO直接用%s,比较大小用strcmp(s1, s2)<0说明s1<s2
#include<iostream>
#include<algorithm>
using namespace std;
struct S
{
string num;
string name;
int g;
} s[100005];
int cmp1(S a,S b)
{
return a.num<b.num;
}
int cmp2(S a,S b)
{
if(a.name==b.name)
return a.num<b.num;
return a.name<b.name;
}
int cmp3(S a,S b)
{
if(a.g==b.g)
return a.num<b.num;
return a.g<b.g;
}
int main()
{
int n,i,t=1;//人数,排序方式
while(cin>>n>>i)
{
if(!n) break;
for(int j=0; j<n; j++)
{
s[j].num.resize(10);//必须要预先分配空间,不然会全乱了
s[j].name.resize(10);
scanf("%s%s%d" ,&s[j].num[0],&s[j].name[0],&s[j].g);
// cin>>s[j].num>>s[j].name>>s[j].g;
}
switch(i)
{
case 1:
sort(s,s+n,cmp1);
break;
case 2:
sort(s,s+n,cmp2);
break;
case 3:
sort(s,s+n,cmp3);
}
printf("Case %d:\n",t++);//这样写挺巧妙
for(int j=0; j<n; j++)
printf("%s %s %d\n" ,s[j].num.c_str(),s[j].name.c_str(),s[j].g);
// cout<<s[j].num<<' '<<s[j].name<<' '<<s[j].g<<endl;
}
return 0;
}
用字符数组 或 string,两种方法都OK
char a[205];
while(gets(a))
{
sort(a,a+strlen(a));
printf("%s\n",a);
}
string a;
while(getline(cin,a))
{
sort(a.begin(),a.end());
printf("%s\n",a.c_str());
}
hash应用
用两个数组做hash,N对应读者编号,M对应书本编号,输入的时候,记录N读的书M[i],同时M[i]++以记录读这本书的人数,最后遍历读者,如果N读的书M[i]≥2,说明有共同读者,去除自己 输出M[i]-1即可:
#include<iostream>
#include<string.h>
using namespace std;
int N[10000];
int M[205];
int main()
{
int n,m;
cin>>n>>m;
memset(M,0,sizeof(M));
for(int i=0;i<n;i++)
{
scanf("%d",&N[i]);
M[N[i]]++;
}
for(int i=0;i<n;i++)
{
if(M[N[i]]>=2)
printf("%d\n",M[N[i]]-1);//减去自己
else printf("BeiJu\n");
}
return 0;
}
STL
set :Set Similarity,求两个集合的“相似度”,学到的:
- auto
- s.count(x)==1表示存在
- 100.0*xxx自动变成浮点型,不用转换了
#include<iostream>
#include<set>
#include<unordered_map>
using namespace std;
const int N=105;
int n,q;
set<int>st[N];
set<int>::iterator it;
int main() {//coding 22:30->46
cin>>n;
for(int i=1,m,t; i<=n; i++) {
cin>>m;
while(m--) {
cin>>t;
st[i].insert(t);
}
}
cin>>q;
for(int i=0,a,b;i<q;i++){
cin>>a>>b;
set<int>s=st[b];
int com=0,sum=s.size();
for(auto it=st[a].begin();it!=st[a].end();it++)
if(s.count(*it)==1) com++;
else sum++;
printf("%.1lf%\n",100.0*com/sum);//100.0会变成浮点数
}
return 0;
}