网址:https://ac.nowcoder.com/acm/contest/301/A

思路一:纯暴力--虽然知道O(n2)过不了,但是想的不至于一个也骗不来分数吧
#include <iostream>
using namespace std;
int main()
{
freopen("d:\\in.dat","r",stdin);
freopen("d:\\out.dat","w",stdout);
//cin>>n>>m;
int n=123456,m=123456;
int sum=0;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
if ((i+j)%7==0) sum++;
}
}
cout<<sum;
return 0;
}
结果一个样例也没过。TLE。。数据狠
思路二:暴力可以拿来当对拍用了
m+n 最大10的7次方
7的倍数 可以在O(n)范围内枚举出来
挨个倍数去求 去暴力判断还是O(n2)炸
后来走了几组数据,对于每一个倍数来说,不用挨个去判断 只需要找 最大最小
比如
n: 1 2 3 4 5 6 7
m:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
那么所能取得的最大7的倍数为 (7+15)/7*7 = 21
(1) 21的全部组合:
min(7,15) = 7 那么 在 大的m序列里
最低的位置为low = 21-7=14
最高的位置为high = 21-1=20 取 min(20.15)=15
所以 21 15-14+1=2种 即(14,7),(15,6)
(2)14的全部组合
low = 14-7=7
hight = 14-1=13
所以14 13-7+1=7种 即(7,7) (8,6) (9,5) (10,4) (11,3) (12,2) (13,1) 7种
(3)7的全部组合
low = 7-7 =0 取max(1,0) 1
high = 7-1=6
所以7 6-1+1=6 即(1,6)(2,5)(3,4)(4,3)(5,2)(6,1) 6种
所以 sum=6+7+2=15种
#include <iostream>
using namespace std;
int main()
{
int n,m,sum=0;
cin>>n>>m;
int minNM = n>m?m:n; //取m,n较小值
int maxNM = n>m?n:m; //取m,n较大值
int max7 = (n+m)/7*7; //看可以取到的最大7的倍数
for (int k=max7/7; k>=1; k--) //枚举1倍到最大倍数
{
int bei7 = k*7; //当前待求7的倍数
int low = bei7 - minNM > 0? bei7-minNM:1; //取在maxNM里的下限
int hight = bei7-1>maxNM?maxNM:bei7-1; //取在maxNM里的上限
sum+=hight-low+1; //上限-下限+1为 该倍数组合个数
}
cout<<sum;
}
60%样例过了 时间复杂度 o(n)
思路三:
对拍
一直没想明天错哪儿了,试了几个数据对啊
后来想到对拍 发现 int sum 直接输出负数
恍然大悟 改为 long long sum =0;
AC
ACM竞赛7的倍数问题优化
1050

被折叠的 条评论
为什么被折叠?



