题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1280
最开始我的思路是错的,我先把数据从小到大排序,例如 1234,先3+4,再2+4,2+3。。。但这只适用于连续的自然数,如果是
2 3 4 6 7 9 ,如果输出四个,就会按序输出16,15,13,14
错误代码
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int m,n,i,j;
int s;
bool flag;
vector<int> vec;
while(scanf("%d%d",&m,&n)!=EOF)
{
vec.clear();
while(m--)
{
cin>>s;
vec.push_back(s);
}
sort(vec.begin(),vec.end());
flag=false;
for(i=vec.size()-2;i>=0;i--)
{
for(j=vec.size()-1;j>i;j--)
{
if(n-->0)
{
if(!flag) flag=true;
else cout<<" ";
cout<<vec[j]+vec[i];
}
}
}
cout<<endl;
}
return 0;
}
后来我先将所有的和算出来 存在容器中 在用 sort 排序,用 reverse 反排序
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int s,m,n,i,j,k;
vector<int> vec1;
vector<int> vec;
bool flag;
while(scanf("%d%d",&m,&n)!=EOF)
{
vec.clear();
vec1.clear();
while(m--)
{
cin>>s;
vec1.push_back(s);
}
for(i=0;i<vec1.size();i++)
{
for(j=i+1;j<vec1.size();j++)
{
vec.push_back(vec1[i]+vec1[j]);
}
}
sort(vec.begin(),vec.end());
reverse(vec.begin(),vec.end());//也可以不要
flag=false;
for(k=0;k<n;k++) //将此处改成 for(k=vec.size()-1;<span style="font-family: Arial, Helvetica, sans-serif;">k>vec.size()-1-n;k--)</span>
{
if(!flag) flag=true;
else cout<<" ";
cout<<vec[k];
}
cout<<endl;
}
return 0;
}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1035
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
char s[10][10];
int r,c,n,k,i,j;
bool flag;
while(cin>>r>>c>>n&&r!=0||c!=0)
{
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cin>>s[i][j];
}
}
k=0;
flag=false;
i=0;j=n-1;
while(i<r&&j<c&&i>=0&&j>=0)
{
switch(s[i][j])
{
case 'N':s[i][j]=k++; //k 记录所走的步数,赋值给s[i][j],一旦循环再次回到这个点,s[i][j]已经变成了整数,则执行 default语句
i--;break;
case 'S':s[i][j]=k++;
i++;break;
case 'E':s[i][j]=k++;
j++;break;
case 'W':s[i][j]=k++;
j--;break;
default:k=k-s[i][j];// 循环的步数
flag=true;
}
if(flag) break; //一旦循环了一次就跳出while循环
}
if(flag) printf("%d step(s) before a loop of %d step(s)\n",s[i][j],k);// s[i][j]记录未进入循环前的步数
else printf("%d step(s) to exit\n",k);
}
return 0;
}