题目描述
数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
输入例子:
4
0 1
0 2
1 2
3 4
输出例子:
0 3
1 2
数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
输入例子:
4
0 1
0 2
1 2
3 4
输出例子:
0 3
1 2
3 4
解题要点:
1.打算用什么样的方式来存放表每一项的索引和键值,即选什么数据结构。数组、结构体(类)。
数组:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int index,value,num;
int key_value[10000]={0}; //设置初值为0; index作为数组的下标,value作为数组的值;
//vector<int> key_value(10000,0);
cin>>num;
for(int i=0;i<num;i++)
{
cin>>index>>value;
key_value[index]+=value;
}
for(int i=0;i<10000;i++)
if(key_value[i]!=0) 当初值为0时,表名对应i无此index 这里只有当所有相同index的value之和不为0的情况才正确,这是此方法的一个限制;
cout<<i<<" "<<key_value[i]<<endl;
return 0;
}
</pre><pre name="code" class="cpp"><span style="font-size:24px;color:#3366ff;"><strong>类(结构体)</strong></span>
#include <iostream>
#include <vector>
using namespace std;
class key_value
{
public:
int index;
int value;
};
int main()
{
int num,i,j,k;
cin>>num;
key_value kv[num]; //类的对象是数组
//输入
for(i=0;i<num;i++)
{
cin>>kv[i].index>>kv[i].value;
}
//相同index的合并
for( i=0;i<num-1;i++)
for(j=i+1;j<num;j++)
if(kv[i].index==kv[j].index)
{
kv[i].value+=kv[j].value;
for(k=j;k<num-1;k++) //删除数组中的一个元素操作,不用vector中的erase,总出毛病
kv[k]=kv[k+1];
j--; //注意此处;
num--;
}
//将类(结构体)按index<span style="color:#ff0000;">排序:如果用二维数组,则在排序时,无法交换两个元素。</span>
key_value temp;
for(i=0;i<num-1;i++)
for(j=0;j<num-1;j++)
if(kv[j].index>kv[j+1].index)
{
temp=kv[j];
kv[j]=kv[j+1];
kv[j+1]=temp; //可用swap()函数
}
//输出
for(i=0;i<num;i++)
cout<<kv[i].index<<" "<<kv[i].value<<endl;
return 0;
}