赞
踩

就在昨天,我参加了一个日本的比赛,里面的题目有点难度,我只做出前三题,想自己试试的朋友可以进这里看看(里面全是英语和日语,建议带一本词典刷题...)。
废话不多说,刷题吧!
我们老师把生怕我们看不懂,所以翻译了一下.
期限:2秒/内存限制:1024 MB
满分:300分
问题描述:
我们将向N个编号为1,2,...,N的人发放总共K张卡片。 从A开始,我们将按照这个顺序把卡片逐一发给大家。A,A+1,A+2,...,N,1,2,.... 谁会得到最后一张牌? 从形式上看,在人x(1≤x<N)得到一张牌后,人x+1将得到一张牌。在N人得到一张牌后,1人得到一张牌。
约束条件:
输入
从标准输入输入给出以下格式:
N K A
输出
打印一个数字代表的人将得到最后一张牌。
输入样例1:
3 3 2
输出样例1:
1
输入样例2:
1 100 1
输出样例2:
1
输入样例3:
3 14 2
样例3:
3
思路: 这道题有点水可以模拟,但也可以用周期题的思路来解:从第A个人开始传,前面还有A-1人,我们加上A-1张牌,这道题就变成了一道经典的周期问题了。
代码:
- #include <bits/stdc++.h>
- using namespace std;
- int n,k,a;
- int main() {
- scanf("%d%d%d",&n,&k,&a);
- int u=(k+a-1)%n;
- if(u==0)
- u=n;
- printf("%d",u);
- return 0;
- }
期限:2秒/内存限制:1024 MB
满分:200分
问题描述: 有N个编号为1至N的人,第i人猜测基恩士总部大楼的建筑面积为S i平方米。 基恩士总部大楼的形状如下所示,其中a和b是一些正整数。 也就是说,该楼的建筑面积可以表示为4ab+3a+3b。 仅根据这些信息,N个人中保证有多少人的猜测是错误的?

约束条件:
输入
从标准输入输入给出以下格式: N S[1]...S[n]
输出
打印答案。
输入样例1:
3
10 20 39
输出样例1:
1
输入样例2:
5
666 777 888 777 666
输出样例2:
3
思路:
这道题只能模拟,模拟A,B的值。不过此题如果A或B任意一数大于142,那么值就会大于1000;so,A、B各只要模拟到142即可。
代码:
- #include <bits/stdc++.h>
- using namespace std;
- int n,x,sum=0;
- bool b[1010];
- int main() {
- for(int A=1;A<=142;A++)
- {
- for(int B=1;B<=142;B++)
- {
- if(4*A*B +3*A +3*B>1000)
- break;
- b[4*A*B +3*A +3*B]=1;
- }
- }
- scanf("%d",&n);
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&x);
- if(!b[x])
- sum++;
- }
- printf("%d",sum);
- return 0;
- }

期限:2秒/内存限制:1024 MB
满分:300分
问题描述:
给你一个正整数N,求正整数(A,B,C)的三元组数。 约束条件保证答案小于。
约束条件:
输入:
从标准输入输入给出以下格式:
N
输出:
打印答案。
输入样例1:
4 输出样例1:
5 有五个这样的三元组:(1,1,1),(1,1,2),(1,1,3),(1,- 1,4),(1、2、2)
输入样例2:
100
输出样例2:
323
输入样例3:
100000000000
输出样例3:
5745290566750
思路: 这道题真的恶心思路也是枚举。
这是我一开始的代码:
- #include <bits/stdc++.h>
- using namespace std;
- long long n,x,sum=0;
- bool b[1010];
- int main() {
- scanf("%lld",&n);
- for(long long a=1;a<=n;a++)
- {
-
- for(long long b=a;b<=n;b++)
- {
- long long u=n/b/a;
- if(u>=b)
- sum+=(u-b)+1;
- }
- }
- printf("%lld",sum);
- return 0;
- }

结果TLE了。

改进了一点:
- #include <bits/stdc++.h>
- using namespace std;
- long long n,x,sum=0;
- bool b[1010];
- int main() {
- scanf("%lld",&n);
- long long p=pow(n,1.0/3.0);
- for(long long a=1;a<=p;a++)
- {
-
- for(long long b=a;b*a*b<=n;b++)
- {
- long long u=n/a/b;
- if(u>=b)
- {
- sum+=(u-b)+1;
- }
- }
- }
- printf("%lld",sum);
- return 0;
- }

终于,我WA了


我的代码这么漂亮,怎么会WA咧?
我和一个同学想了两个多小时,
这时,他@了我:

我...

正确代码:
- #include <bits/stdc++.h>
- using namespace std;
- long long n,x,sum=0;
- bool b[1010];
- int main() {
- scanf("%lld",&n);
- for(long long a=1;a*a*a<=n;a++)
- {
- long long u=sqrt(n/a);
- for(long long b=a;b<=u;b++)
- {
- u=n/a/b;
- if(u>=b)
- {
- // cout<<a<<" "<<b<<" "<<u<<" "<<endl;
- sum+=(u-b)+1;
- }
-
- }
- }
- printf("%lld",sum);
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。