前言:
就在昨天,我参加了一个日本的比赛,里面的题目有点难度,我只做出前三题,想自己试试的朋友可以进这里看看(里面全是英语和日语,建议带一本词典刷题...)。
废话不多说,刷题吧!
我们老师把生怕我们看不懂,所以翻译了一下.
第A题:最后一张牌
期限: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人得到一张牌。
约束条件:
- 1≤N,K≤1000
- 1≤A≤N
- 所有值在输入整数。
输入
从标准输入输入给出以下格式:
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;
}
第B题:基恩士大厦
期限:2秒/内存限制:1024 MB
满分:200分
问题描述: 有N个编号为1至N的人,第i人猜测基恩士总部大楼的建筑面积为S i平方米。 基恩士总部大楼的形状如下所示,其中a和b是一些正整数。 也就是说,该楼的建筑面积可以表示为4ab+3a+3b。 仅根据这些信息,N个人中保证有多少人的猜测是错误的?
约束条件:
- 1≤N≤20
- 1≤Si≤1000
- 所有值在输入整数。
输入
从标准输入输入给出以下格式: 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;
}
第C题:
期限:2秒/内存限制:1024 MB
满分:300分
问题描述:
给你一个正整数N,求正整数(A,B,C)的三元组数。 约束条件保证答案小于。
约束条件:
- 1≤N≤
- N是一个整数。
输入:
从标准输入输入给出以下格式:
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;
}