北大ACM 1007 DNA Sorting

一起来玩玩呗 2013-08-20 07:45:05
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
//#define MAXFORVALUE 1000 // 所能容纳的最大权值

using namespace std;

typedef pair<string, int> PAIR;

string *str=NULL;
map<string, int> result;
int count_num=0;
int size = 0;
bool flag = false; // 是否有重复字串出现的标志位
string *repeat = new string[50];
int repeat_num = 0;

void InputMessage();
void SortForValue();
void OutputMessage();

int main()
{
InputMessage();
SortForValue();
OutputMessage();

//int f;
//cin >> f;
return 1;
}

int cmp(const PAIR& x, const PAIR& y)
{
return x.second < y.second;
}

void OutputMessage()
{
map<string, int>::const_iterator map_it = result.begin();
vector<PAIR> vecpair;

for(map<string, int>::iterator curr = result.begin(); curr != result.end(); ++curr)
{
vecpair.push_back(make_pair(curr->first, curr->second));
}
sort(vecpair.begin(), vecpair.end(), cmp);
for(unsigned int i=0; i < vecpair.size(); i++)
{
if(flag)
{
for(int j = 0; j < repeat_num; j++)
{
if(vecpair[i].first == repeat[j])
{
for(int k = 0; k < 2; k++)
cout << vecpair[i].first << endl;
}
}
}else {
cout << vecpair[i].first << endl;
}
}
}

void SortForValue()
{
int value = 0; //得到字串的权值

for(int i=0; i<count_num; i++)
{
for(int j=0; j < size; j++)
{
for(int k=j+1; k <size; k++)
{
if(str[i][j] > str[i][k])
{
value++;
}
}
}
pair<map<string, int>::iterator, bool> ret =
result.insert(make_pair(str[i], value));
if(!ret.second)
{
flag = true;
repeat[repeat_num] = str[i];
repeat_num++;
}
// cout << "第" << i+1 << "个权值为" << value << endl;
value = 0;
}
}

void InputMessage()
{
cin >> size >> count_num;
str = new string[count_num];
for(int i=0; i < count_num; i++)
cin >> str[i];
}



测试正确,可是提交的时候却“wrong answer”
求指点......
...全文
203 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
一起来玩玩呗 2013-08-23
  • 打赏
  • 举报
回复
引用 5 楼 FancyMouse 的回复:
我1L的例子你还是没解决。真不知道你“测试正确”怎么测的。 1 6 A A A C C G
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
//#define MAXFORVALUE 1000 // 所能容纳的最大权值 
using namespace std;
typedef pair<string, int>  PAIR;
 
string *str=NULL;
map<string, int> result;
int count_num=0;
int size = 0;
string *repeat = new  string[50];
int repeat_num = 0;
 
void InputMessage();
void SortForValue();
void OutputMessage();
 
int main()
{
    InputMessage();
    SortForValue();
    OutputMessage();
 
    //int f;
    //cin >> f;
    return 1;
}
 
int cmp(const PAIR& x,  const PAIR& y)
{
    return x.second < y.second;
}
 
void OutputMessage()
{
    map<string, int>::const_iterator map_it = result.begin();
    vector<PAIR> vecpair;
 
    for(map<string, int>::iterator curr = result.begin(); curr != result.end(); ++curr)
    {
        vecpair.push_back(make_pair(curr->first, curr->second));
    }
    sort(vecpair.begin(), vecpair.end(), cmp);
    int count_repeat = 0;
    int j = 0;
    int flag = false;
    for(unsigned int i=0; i < vecpair.size(); i++)
    {
        for(int j = 0; j < repeat_num; j++)
        {
            if(vecpair[i].first == repeat[j])
            {
                cout << repeat[j] << endl;
            }
        }
        cout << vecpair[i].first << endl;
    }
}
 
void SortForValue()
{
    int value = 0; //得到字串的权值
     
    for(int i=0; i<count_num; i++)
    {
        for(int j=0; j < size; j++)
        {
            for(int k=j+1; k <size; k++)
            {
                if(str[i][j] > str[i][k])
                {
                    value++;
                }
            }
        }
        pair<map<string, int>::iterator, bool> ret = 
            result.insert(make_pair(str[i], value));
        if(!ret.second) //如果出现重复的字串
        {
            repeat[repeat_num] = str[i];
            repeat_num++;
        }
        value = 0;
    }
}
 
void InputMessage()
{
    cin >> size >> count_num;
    str = new string[count_num];
    for(int i=0; i < count_num; i++)
        cin >> str[i];
}
谢谢你了,我修改了下,已经通过了!谢谢啦!我看了下你的回复时间,想说下“身体才是革命的本钱啊”
FancyMouse 2013-08-23
  • 打赏
  • 举报
回复
我1L的例子你还是没解决。真不知道你“测试正确”怎么测的。 1 6 A A A C C G
一起来玩玩呗 2013-08-22
  • 打赏
  • 举报
回复
引用 3 楼 FancyMouse 的回复:
[quote=引用 2 楼 q745401990 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] 你这个repeat逻辑,输入3个相同的字符串你岂不是要输出4个?
不会啊 ,我是先判断如果有重复的出现以后,然后再比较是否是当前循环的那个,如果是的话就输出两遍[/quote] 你自己调试一遍就知道我说的什么意思了。 顺便你的代码如果有一个重复的话,所有不重复的都输出不了。这repeat的逻辑建议重写。[/quote]
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
//#define MAXFORVALUE 1000 // 所能容纳的最大权值 
using namespace std;
typedef pair<string, int>  PAIR;

string *str=NULL;
map<string, int> result;
int count_num=0;
int size = 0;
string *repeat = new  string[50];
int repeat_num = 0;

void InputMessage();
void SortForValue();
void OutputMessage();

int main()
{
	InputMessage();
	SortForValue();
	OutputMessage();

	//int f;
	//cin >> f;
	return 1;
}

int cmp(const PAIR& x,  const PAIR& y)
{
	return x.second < y.second;
}

void OutputMessage()
{
	map<string, int>::const_iterator map_it = result.begin();
	vector<PAIR> vecpair;

	for(map<string, int>::iterator curr = result.begin(); curr != result.end(); ++curr)
	{
		vecpair.push_back(make_pair(curr->first, curr->second));
	}
	sort(vecpair.begin(), vecpair.end(), cmp);
	int count_repeat = 0;
	int j = 0;
	int flag = false;
	for(unsigned int i=0; i < vecpair.size(); i++)
	{
		for(int j = 0; j < repeat_num; j++)
		{
			if(vecpair[i].first == repeat[j])
			{
				cout << vecpair[i].first << endl;
				cout << vecpair[i].first << endl;
				flag = true;
			}
		}
		if(flag)
		{
			flag = false;
			break;
		}
		cout << vecpair[i].first << endl;
	}
}

void SortForValue()
{
	int value = 0; //得到字串的权值
	
	for(int i=0; i<count_num; i++)
	{
		for(int j=0; j < size; j++)
		{
			for(int k=j+1; k <size; k++)
			{
				if(str[i][j] > str[i][k])
				{
					value++;
				}
			}
		}
		pair<map<string, int>::iterator, bool> ret = 
			result.insert(make_pair(str[i], value));
		if(!ret.second) //如果出现重复的字串
		{
			repeat[repeat_num] = str[i];
			repeat_num++;
		}
		value = 0;
	}
}

void InputMessage()
{
	cin >> size >> count_num;
	str = new string[count_num];
	for(int i=0; i < count_num; i++)
		cin >> str[i];
}
重写了这个重复函数,测试正确,可是submit 时 还是“wrong answer”
FancyMouse 2013-08-21
  • 打赏
  • 举报
回复
引用 2 楼 q745401990 的回复:
[quote=引用 1 楼 FancyMouse 的回复:] 你这个repeat逻辑,输入3个相同的字符串你岂不是要输出4个?
不会啊 ,我是先判断如果有重复的出现以后,然后再比较是否是当前循环的那个,如果是的话就输出两遍[/quote] 你自己调试一遍就知道我说的什么意思了。 顺便你的代码如果有一个重复的话,所有不重复的都输出不了。这repeat的逻辑建议重写。
一起来玩玩呗 2013-08-21
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
你这个repeat逻辑,输入3个相同的字符串你岂不是要输出4个?
不会啊 ,我是先判断如果有重复的出现以后,然后再比较是否是当前循环的那个,如果是的话就输出两遍
FancyMouse 2013-08-21
  • 打赏
  • 举报
回复
你这个repeat逻辑,输入3个相同的字符串你岂不是要输出4个?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧