昨晚我一共做出来了两个题:
第一题:
题意:输入一组数,排列让两数差之和最大,同时从小到大排列;
思路:两数差之和其实就是第一项减最后一项,也就是只要第一项最大,最后一项放最小的就可以,其他升序排列;
注意:合理运用STL知识就好,没有很坑人的地方;
代码:#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int>a;
int i,n,k,b;
cin>>n;
for(i=0;i<n;i++)
{
cin>>b;
a.push_back(b);
}
sort(a.begin(),a.end());
k=a[0];
a[0]=a[n-1];
a[n-1]=k;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
感想:充分认识到STL的好处,一个sort就完美解决排列问题;
第二题:
题意:给出一组数据,判断数与位置是否相等,找到相等的点数;
思路:因为要用到的数其实就是不与下标符合的数,所以可以在输入的时候做一个判断,不符合的就把他和位置放到map容器中,形成映射,输入完之后找是否有两个位置和数对调的,如果有那就让总数加2,没有就加1;
注意:控制有效的数据,如果没有把无效数据删除的话,很容易造成超时的结果;
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int>a;
map<int,int>v;
map<int,int>::iterator p1,p2;
int i,j,k=0,m=0,n,b;
cin>>n;
for(i=0;i<n;i++)
{
cin>>b;
if(b==i)
k++;
else v.insert(make_pair(i,b));
}
p1=v.begin();
for(;p1!=v.end();p1++)
{
p2=v.find(p1->second);
if(p2!=v.end()&&(p2->second)==(p1->first))
m=1;
}
if(k==n)
cout<<k<<endl;
else if(m!=0)
cout<<k+2<<endl;
else cout<<k+1<<endl;
return 0;
}
感想:不能收到多少数据就用多少数据,一定要做好预处理,把真正有用的数据挑选出来,筛掉无用数据,不然就会让数据运行时间过长;