错题题目
1.Goldbach's Conjecture
2.比例简化
3.出租车司机
Goldbach's Conjecture
著名的哥德巴赫猜想,我们先看一下题目:
在六以上的书都能拆成两个质数的和(因为是奇质数所以这两个质数 != 2)
这是第一次只有14分的代码
#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){
for(int i=2;i*i<=n;i++)
if(n%i==0) return 0;
return 1;
}
int in(int n){
for(int i=2;i<n;i++){
if(isprime(i) && isprime(n-i))return i;
}
return 0;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
int n;
while(scanf("%d",&n) && n!=0){
int ans=in(n);
printf("%d = %d + %d",n,ans,n-ans);
}
return 0;
}
这里首先是奇质数所以循环应该从3开始,在循环时i+=2避免2的所有倍数,增加效率,最傻的是输出没换行
让我们来看一下2.0版本
#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){
for(int i=2;i*i<=n;i++)
if(n%i==0) return 0;
return 1;
}
int in(int n){
for(int i=3;i<=n;i+=2){
if(isprime(i) && isprime(n-i))return i;
}
return 0;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
int n;
while(scanf("%d",&n) && n!=0){
int ans=in(n);
printf("%d = %d + %d\n",n,ans,n-ans);
}
return 0;
}
这个代码就可以A了
比例简化
话不多说我们还是来看一下题
这个题目的大意是
该你两个数A,B你要尽量简化A,B是他们比L小,但和A,B的误差最小
所以这个题思路是
//在x,y≤L, x/y≥A/B(x*B≥A*y), gcd(x,y) == 1下, 最小化(x/y-A/B)
我们来看一下标程
#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int A, B, L;
cin >> A >> B >> L;
int ax = 1e6, ay = 1;
// x,y≤L, x/y≥A/B(x*B≥A*y), gcd(x,y) == 1, 最小化(x/y-A/B)
for (int x = 1; x <= L; x++)
for (int y = 1; y <= L && A * y <= B * x; y++)
if (gcd(x, y) == 1 && x * ay < ax * y) // x/y<ax/ay ↔️ x*ay<ax*y
ax = x, ay = y;
printf("%d %d\n", ax, ay);
return 0;
}
其中 x/y<ax/ay ↔️ x*ay<ax*y是运用了不等式的性质(交叉相乘积相等)
出租车司机
这个代码很简单,我是条件写错了
我们来看一下正确的条件:
#include <bits/stdc++.h>
using namespace std;
int main(){
int x, n; cin >> x >> n;
double m = 0, sum = 0; //m表示走的总路程,sum是赚的钱
for(int i = 1; i <= n; i++){
double a; cin >> a;
m += a;
if(a <= 3) sum += 10;
else sum = sum + 10 + 2 * ceil(a - 3); //ceil()向上取整,不足一公里的要按照一公里算
if(sum >= x) break; //赚够了就收手
}
printf("%.3lf", m / 20);
return 0;
}
这里逻辑很简单,a <= 3表示是起步价 else 表示一公里2元,不足一公里按一公里算,sum>=x表示赚的钱够了。
今天的错题集就写到这儿了,谢谢。