这样,怎能不愤怒!--【附注】1129解题报告
换了一下,就AC了,其实还是WA!
原来WA的程序,是直接从原来具有的数值开始++,但毫无疑问,答案一定是正确的。
现在,是从1开始往上加,如果遇到相同的,继续加。
bool check(int value,int i)
{
int j=2;
while(mg[i][j]!=0)
{
if(node[mg[i][j]].index==value)
return false;
j++;
}
return true;
}
对于这道题目,我感觉有点愤愤的,就是偷懒了一下,就这样的后果么?
Source Code
Problem: 1129 | User: omycle | |
Memory: 256K | Time: 0MS | |
Language: C++ | Result: Accepted |
- Source Code
#include <iostream>
using namespace std;
int mg[30][30];
typedef struct
{
// int bz;//代表的含义
int index;//代表分的channel
}Channel;
int TotalCount=0;
Channel node[27];
void Init()
{
for(int i=1;i<=TotalCount;i++)
{
node[i].index=0;
}
}
bool check(int value,int i)
{
int j=2;
while(mg[i][j]!=0)
{
if(node[mg[i][j]].index==value)
return false;
j++;
}
return true;
}
void Bianli()
{//初始情况i=0;
for(int i=1;i<=TotalCount;i++)
{
if(node[i].index==0)
node[i].index=1;
int j=1;
int temp=node[i].index;//保存这个数值用于比较
while(mg[i][j]!=0)
{
if(node[mg[i][j]].index==0||node[mg[i][j]].index==temp)
{
node[mg[i][j]].index=1;
while(1)
{
if(node[mg[i][j]].index!=temp&&check(node[mg[i][j]].index,mg[i][j]))
break;
node[mg[i][j]].index++;
}
}
j++;
}
}
}
void FindMax()
{
int c=0;
for(int i=1;i<=TotalCount;i++)
{
if(node[i].index>c)
c=node[i].index;
}
if(c==1)
printf("%d channel needed.\n",c);
else
printf("%d channels needed.\n",c);
}
int main()
{
int n=0;
cin>>n;
while(n)
{
memset(mg,0,sizeof(mg));
TotalCount=n;
int k=1;
while(k<=n)
{
char a[28];
memset(a,0,sizeof(char)*28);
cin>>a;
int temp_i=0;
int len=strlen(a)-1;
for(int j=0;j<len;j++)
{
while(a[temp_i]==':')
{
temp_i++;
}
if(a[temp_i]!=':')
mg[k][j]=a[temp_i]-'A'+1;
temp_i++;
}
k++;
}
Init();
Bianli();
FindMax();
cin>>n;
}
return 0;
}
这个问题本来已经证明是NP问题,你的贪心算法能AC,只能说明OJ的数据弱..并说明不了你的算法正确..除非你给出证明~ 如果是那样,恭喜你~
回复删除大哥你这是什么算法,有点看不懂啊!
回复删除