计导大作业一点头绪也没有,想不到算法,连暴力都不知道往哪儿用力,话说我还没找到组织,有没有哪个大佬组能把我收了。。。
还是那个北航同学,又扔过来道题目,挺简单的,就是嵌套排序用的不太利索了。
#include <stdio.h>
typedef struct _item
{
int x;
int y;
int vi;
int pi;
} Item;
int main(int argc, char const *argv[])
{
int n;
scanf("%d",&n);
int nn=n*n;//整个大小是n*n
Item sheet[nn];//把所有的标志存到一个线性的结构数组里
int i,j,tmp;
for(i=0;i<n;++i)
for(j=0;j<n;++j)
{
sheet[i*n+j].x=i+1;
sheet[i*n+j].y=j+1;
scanf("%d",&sheet[i*n+j].vi);
}
//保存坐标和vi
for(i=0;i<nn;++i)
scanf("%d",&sheet[i].pi);
//读入pi
int order[nn];
for(i=0;i<nn;++i) order[i]=i;//创建嵌套排序辅助数组
for(i=1;i<nn;++i)
for(j=0;j<nn-i;++j)
if((sheet[order[j]].vi)<(sheet[order[j+1]].vi))
{
tmp=order[j];
order[j]=order[j+1];
order[j+1]=tmp;
}
//嵌套的冒泡排序,顺序存在order数组里
int loc=order[0],max_vi=sheet[order[0]].vi,min_pi=sheet[order[0]].pi;
//默认最优解是order[0],之后检查后再换
for(i=1;i<nn;++i)
{
if(sheet[order[i]].vi!=max_vi) break;//说明vi变小了,不是在最大之中找了
if(sheet[order[i]].pi<min_pi)//pi更小是更优解
{
min_pi=sheet[order[i]].pi;
loc=order[i];
}
}
printf("%d %d\n",sheet[loc].x,sheet[loc].y );
return 0;
}
稍微改进一下
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n;scanf("%d",&n);
int nn=n*n;
int vi[nn],pi[nn];
int i;
for(i=0;i<nn;++i) scanf("%d",&vi[i]);
for(i=0;i<nn;++i) scanf("%d",&pi[i]);
int max_vi=vi[0],pin=0,max_loc[nn];
max_loc[pin++]=0;
for(i=0;i<nn;++i)
if(vi[i]==max_vi) max_loc[pin++]=i;
else if(vi[i]>max_vi)
{
pin=0;
max_loc[pin++]=i;
max_vi=vi[i];
}
int min_pi=pi[max_loc[0]],loc=max_loc[0];
for(i=1;i<pin;++i)
if(pi[max_loc[i]]<min_pi)
{
min_pi=pi[max_loc[i]];
loc=max_loc[i];
}
printf("%d %d\n",loc/n+1,loc%n+1 );
return 0;
}