哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.做好了这件实事,就能说明这个猜想是成立的.由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
题解:
埃氏筛求素数;
将所有素数标记一遍,然后for循环从中间向两边查找最先满足条件的一对,然后输出即可;
#include<bits/stdc++.h>
using namespace std;
#define int long long
int prim[10005],vis[10005],cnt=0;
void k(void){
for(int i=2;i<=10000;i++){
if(vis[i]==0){
prim[++cnt]=i;
}
for(int j=1;j<=cnt&&i*prim[j]<=10000;j++){
vis[i*prim[j]]=1;
if(i*prim[j]==0)break;
}
}
}
signed main(){
int n;
k();
while(scanf("%ld",&n)!=EOF){
for(int i=(n/2)+1;i>0;i--){
if(vis[i]==0&&vis[n-i]==0){
if(i<n-i)cout<<i<<" "<<n-i<<endl;
else {
cout<<n-i<<" "<<i<<endl;
}
break;
}
}
}
return 0;
}
如果平面上有n个点,并且每个点至少有2条曲线段和它相连,就是说,每条曲线都是封闭的,同时,我们规定:
1)所有的曲线段都不相交;
2)但是任意两点之间可以有多条曲线段。
如果我们知道这些线段把平面分割成了m份,你能知道一共有多少条曲线段吗?
题解:
多组输入:
n个点相互封闭连接就有两个面,如果不封闭就一个面,如果想要分割成n个面,就在内部图像在画一根线,所以答案就是(m-2)+n;
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[2008],cha[2008],sum;
signed main(){
int n,m;
while(cin>>n&&cin>>m){
if(n==0&&m==0)break;
int ans;
if(m==1){
cout<<"0"<<endl;
continue;
}
else {
ans=n+(m-2);
cout<<ans<<endl;
}
}
return 0;
}
挨个判断每棵树的坚果数量是不是大于10就行,如果大于10,就那走这棵树-10后的坚果;
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[2008],cha[2008],sum;
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>10){
sum+=a[i]-10;
}
}
cout<<sum<<endl;
return 0;
}
将每一位上的数字都模3,计数统计模3后为1,模3后为2后的数有几个;
如果给定的那个数原本就是3的倍数,直接输出0,如果原来的数模3后还剩1,有两种操作,可以删除一个余数为1的,此时就需要看看余1的个数有几个,如果有就输出一,还有一种才做就是删除掉两个余数为2的位数上的数,如果余数为2的个数大于等于2就输出2,两个都不满足的输出-1;
给定的那个数除模以后余二是一样的操作,两个一,或则一个二:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[2008],c,cha[2008],sum,number[10];
signed main(){
string h;
cin>>h;
int n=h.size();
int num=0;
for(int i=0;i<n;i++){
c=h[i]-'0';
num+=c;
c%=3;
number[c]++;
}
if(num%3==0)cout<<"0"<<endl;
else if(num%3==1){
if(number[1]&&n>1)cout<<"1"<<endl;
else if(number[2]>=2&&n>2)cout<<"2"<<endl;
else cout<<"-1"<<endl;
}
else {
if(number[2]&&n>1)cout<<"1"<<endl;
else if(number[1]>=2&&n>2)cout<<"2"<<endl;
else cout<<"-1"<<endl;
}
return 0;
}
看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太多了,于是xhd决定随便搬2k件过去就行了.但还是会很累,因为2k也不小是一个不大于n的整数.幸运的是xhd根据多年的搬东西的经验发现每搬一次的疲劳度是和左右手的物品的重量差的平方成正比(这里补充一句,xhd每次搬两件东西,左手一件右手一件).例如xhd左手拿重量为3的物品,右手拿重量为6的物品,则他搬完这次的疲劳度为(6-3)^2 = 9.现在可怜的xhd希望知道搬完这2*k件物品后的最佳状态是怎样的(也就是最低的疲劳度),请告诉他吧.
用a[i]储存n个武平的重量,对重量进行排序,因为要两个值尽可能的小,那么当去了第i个物品。令dp[i][j]表示前i个物品,令dp[i][j]表示前i个物品,取j对的最小疲劳度,若取第i个物品,则就要取i-1个物品,所以状态方程就是dp[i][j]=dp[i-2][j-1]+(a[i-1]*a[i])*(a[i-1]*a[i]);
要是不取,则dp[i][j]=dp[i-1][j];
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[20005];
int dp[2005][2005];
int n,m,l=1,r,ans;
signed main(){
int n,k;
//int sum=0;
while(cin>>n>>k){
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
for(int j=1;j*2<=i;j++){
dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]);
//dp[i][j]=max(dp[j],dp[j-a[i]]+a[i]);
if(i>2*j){
dp[i][j]=min(dp[i][j],dp[i-1][j]);
}
}
cout<<dp[n][k];
}
}
return 0;
}