编程之美的第二题:长方形,自己写的代码测试了各种数据提交后一直WA不知什么原因请大神帮助一下

yfjily5233 2013-04-06 03:53:34
时间限制: 1000ms 内存限制: 256MB

描述
在 N × M 的网格上,放 K 枚石子,每个石子都只能放在网格的交叉点上。问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。

输入
输入文件包含多组测试数据。

第一行,给出一个整数T,为数据组数。接下来依次给出每组测试数据。

每组数据为三个用空格隔开的整数 N,M,K。

输出
对于每组测试数据,输出一行"Case #X: Y",其中X表示测试数据编号,Y表示最多能找到的符合条件的长方形数量。所有数据按读入顺序从1开始编号。

数据范围
1 ≤ T ≤ 100

0 ≤ K ≤ N * M

小数据:0 < N, M ≤ 30

大数据:0 < N, M ≤ 30000



样例输入
3
3 3 8
4 5 13
7 14 86
样例输出
Case #1: 5
Case #2: 18
Case #3: 1398





#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<algorithm>
#include<cmath>
using namespace std;
int mi(int a,int b){
if(a<b)
return a;
else return b;

}
int c1(int x1,int x2){
int cc,bb,i;
cc=bb=0;
for(i=1;i<x2;++i){
cc=cc+i;
}
for(i=1;i<=x1;++i){
bb=bb+i;
}
return cc*bb;

}
int c2(int x3,int x4){

int cc,i;
cc=0;
for(i=1;i<x3;++i)
cc=cc+i;
return cc*(x4+1);
}
int main(){

vector<int> ss;
int t,n,m,k,i,count,mc,hs,dy;
cin>>t;

if(t>=1&&t<=100){
while(t--){

count=0;
cin>>n>>m>>k;
if(k>=0&&k<=(n*m)&&n>=0&&n<=30000&&m>=0&&m<=30000){

if(k<=3){
ss.push_back(0);
}else if(k==4)
ss.push_back(1);
else if(k>4){

mc=mi(n,m);
hs=k/mc-1;
count=count+c1(hs,mc);
dy=k%mc;
count=count+c2(dy,hs);
ss.push_back(count);


}
}else ss.push_back(0);


}
for(i=0;i<ss.size();++i){

cout<<"Case#"<<i+1<<": "<<ss[i]<<endl;

}
}
return 0;
}
...全文
2986 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunkissedboy 2013-04-08
  • 打赏
  • 举报
回复
引用 23 楼 lishmoshou 的回复:
刚才想到一个测试点,大家试试吧,估计很多人都通不过。m=3,n=5,k=10 结果是10
确实是10.。。。。
sunkissedboy 2013-04-08
  • 打赏
  • 举报
回复
引用 23 楼 lishmoshou 的回复:
刚才想到一个测试点,大家试试吧,估计很多人都通不过。m=3,n=5,k=10 结果是10
应该是9,你画不出10的吧?
sunkissedboy 2013-04-08
  • 打赏
  • 举报
回复
为什么3,5,10输出结果是10?应该是9吧。。
lishmoshou 2013-04-07
  • 打赏
  • 举报
回复
引用 43 楼 adolphxy 的回复:
引用 42 楼 lishmoshou 的回复:共享代码: C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859#include<cstdio>#include <math.h>#in……
AC了的。
FWJ_mag-liebe 2013-04-07
  • 打赏
  • 举报
回复
很挫的AC源码~
#include <iostream>
using namespace std;

int n0, m0;
int Result(int, int, int);
int Com(int,int,int);

int main(void)
{
    int t, n, m, k;
	cin>>t;
	int *a=new int [t];
    for (int i=0, t0=t; t0>0; t0--)
    {
        cin>>n>>m>>k;
		m0=m;
		n0=n;
        if (k>=0 && n*m>=k)
            a[i++]=Com(n,m,k);
    }
    for (int i=1; i<=t; i++)
		cout<<"Case #"<<i<<": "<<a[i-1]<<endl;
	delete []a;
}


int Result(int n, int m, int k)
{
    if (m>1 && n>1 && n*m<=k && k-n*m<n && k-m*n<m)
	{
		int x, y;
		if (m==m0) return m*n*(m-1)*(n-1)/4+n*(k-m*n)*(k-m*n-1)/2;
		else if (n==n0) return m*n*(m-1)*(n-1)/4+m*(k-m*n)*(k-m*n-1)/2;
		else if(m!=m0 && n!=n0) 
		{
			x=m*n*(m-1)*(n-1)/4+n*(k-m*n)*(k-m*n-1)/2;
			y=m*n*(m-1)*(n-1)/4+m*(k-m*n)*(k-m*n-1)/2;
			return x>=y ? x : y;
		}
	}
	else return 0;
}
int Com(int n,int m,int k)
{
	int *p=new int[m*n];
	int a0=0,i0=0;
	for( ; n>1; n--)
		for(m=m0 ; m>1; m--)
			p[i0++]=Result(n, m, k);
	for (int i=0; i<i0; i++)
		a0=a0>=p[i] ? a0 : p[i];
	delete []p;
	return a0;
}
淡定的小Y 2013-04-07
  • 打赏
  • 举报
回复
求思路而不是代码!!!!
xy_seu 2013-04-07
  • 打赏
  • 举报
回复
引用 42 楼 lishmoshou 的回复:
共享代码: C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859#include<cstdio>#include <math.h>#include <stdlib.h>#includ……
AC了?
lishmoshou 2013-04-07
  • 打赏
  • 举报
回复
共享代码:
#include<cstdio>
#include  <math.h>
#include <stdlib.h>
#include "string.h"
int main()
{
 
int T, t;
scanf("%d",&T);
t = 1;
while (t <= T)
{
int N, M, K;
scanf("%d%d%d",&N,&M,&K);
 
 
int result = 0;
if (N > M)  // 令M>N
{
int tmp = N;
N = M;
M = tmp;
}
 
int n1 = int(sqrt(K*1.0)), n2 = M;
n1 = n1 > N ? N : n1;
for (; n1 * n2 > K; --n2);
 
 
int max = 0;
while (n1 >= 2 && n2 <= M)
{
int k = K;
result += ( n1 * (n1 - 1) * n2 * (n2 - 1) )/4;
k -= n1 * n2;
if (n2 < M)
result += n2 * (k * (k - 1) / 2);
else
result += n1 * (k * (k - 1) / 2);
 
 
max = result > max ? result : max;
 
 
// 修改n1,n2
--n1;
n2 = K / n1;
result = 0;
}
 
printf("Case #%d: %d",t,max);
printf("\n");
 
++t;
}
 
 
return 0;
}
xy_seu 2013-04-07
  • 打赏
  • 举报
回复
再给几组测试数据吧!上面的测试数据都过了,可是依旧WA
nice_cxf 2013-04-07
  • 打赏
  • 举报
回复
就是拆分成一个大长方形+剩余几个小块,一共也就min(m,n)种,分别计算一下,求最大的就可以了 至于说个大长方形有几个长方形,实际就是长宽分别取2点的组合乘积,比如3*5的就是C(3,2)*c(5,2)=30
FWJ_mag-liebe 2013-04-07
  • 打赏
  • 举报
回复
顺便这个TLE,算法好恶心 ~超时了~ 该怎么优化啊
#include <iostream>
#include <string>
using namespace std;

int main(void)
{
    int t, n, m;
    cin>>t;
	string *p=new string[t];
	for (int t0=0; t0<t; t0++)
	{
		string p1[11], p2[11];
		string s;
		cin>>n>>m;
		for (int i=0; i<m; i++)
			cin>>p1[i]>>p2[i];
		cin.get();
		getline(cin, s);
		s=" "+s+" ";
		for (int j=1; j<n; j++)
		{
			string ss=s;
			for (int i=0; i<m; i++)
			{
				if(s.rfind(" "+p1[i]+" ")!=string::npos)
					while (ss.rfind(" "+p1[i]+" ")!=string::npos)
						ss.replace(ss.rfind(" "+p1[i]+" ")+1, p1[i].length(), p2[i]);
			}
			s=ss;
		}
		p[t0]=s.replace(s.rfind(" "), 1, "");
	}
	for (int i=0; i<t; i++)  cout<<"Case #"<<i+1<<":"<<p[i]<<endl;
	delete []p;
}
FWJ_mag-liebe 2013-04-07
  • 打赏
  • 举报
回复
引用 46 楼 m13890 的回复:
引用 44 楼 wykcgp 的回复:很挫的AC源码~ C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include <iostream>using namespace std; int n0, ……
FancyMouse 2013-04-07
  • 打赏
  • 举报
回复
1 4 4 字数补丁
txl012345 2013-04-07
  • 打赏
  • 举报
回复
不理解题目的意思啊。。。谁能解释一下
东北大呲花 2013-04-07
  • 打赏
  • 举报
回复
东北大呲花 2013-04-07
  • 打赏
  • 举报
回复
weichun0713 2013-04-07
  • 打赏
  • 举报
回复
再给几个 测试用例白
weichun0713 2013-04-07
  • 打赏
  • 举报
回复
#include <iostream> #include <vector> using namespace std; bool IsPrime(int n); int fun(int m1,int m2); int min(int n1,int n2); int maxfun(int n1,int n2); int main() { int T; cin>>T; int max=0; int Nmax=0,Mmax=0; vector<int> ivec; while(T--) { int N,M,K; cin>>N>>M>>K; for(int i=0;i<=min(N,M);i++) { int t_temp=K-i; int max_temp=0; if(!IsPrime(t_temp)) { for(int n=2;n<=N;n++) for(int m=2;m<=M;m++) { if(n*m==t_temp) { max_temp=fun(n,m); if(max_temp>max) {max=max_temp,Nmax=n,Mmax=m;} } else if(n*m>t_temp) break; else continue; } } else continue; } //cout<<Nmax<<" "<<Mmax<<endl; if(Nmax*Mmax<K) //补救 { int more; if(Nmax<N&&Mmax<M) //都未满 { more=K-Nmax*Mmax; max+=more*(more-1)*maxfun(Nmax,Mmax)/2; } else //有一个满了 { int temp=(Nmax==N) ? Mmax:Nmax; more=K-Nmax*Mmax; max+=more*(more-1)*temp/2; } } ivec.push_back(max); max=Nmax=Mmax=0; } int index=1; for(vector<int>::iterator it=ivec.begin();it!=ivec.end();it++) cout<<"Case #"<<index++<<": "<<*it<<endl; return 0; } bool IsPrime(int n) { if(n==4) return false; for(int i=2;i<n/2;i++) if(n%i==0) return false; return true; } int fun(int m1,int m2) { return m1*m2*(m1-1)*(m2-1)/4; } int min(int n1,int n2) { return n1>=n2 ? n2:n1; } int maxfun(int n1,int n2) { return n1<=n2 ? n2:n1; }
weichun0713 2013-04-07
  • 打赏
  • 举报
回复
那几个数据都通过了 还是WA!!!!!!!!!!!!!!!
zyr987503101 2013-04-07
  • 打赏
  • 举报
回复
这是什么意思,看了后觉得思路模糊。。。
加载更多回复(37)

65,210

社区成员

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

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