A.Hcode OnlineJudge
先用欧拉筛把质数预处理出来,然后枚举左端点的质数,只需要询问右端点是不是质数并取差值的min就行了
- #include<bits/stdc++.h>
- #define endl '\n'
- #define mk make_pair
- #define int long long
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> PII;
- const int N = 1e6+10;
- int n,m,k;
-
- vector<int>pri;
- bool su[10005];
-
- void get(){
- for(int i=2;i<=10000;i++){
- if(!su[i]) pri.push_back(i);
- for(auto ed:pri){
- if(i*ed>10005) break;
- su[ed*i]=1;
- if(i%ed==0) {break;}
- }
- }
- }
-
- void sovle(){
- get();
- while(scanf("%d",&n)!=EOF){
- int ans1=0,ans2=0,num=1000000;
- for(auto ed:pri){
- if(!su[abs(n-ed)]){
- int vd=abs(n-ed);
- if(abs(ed-vd)<num){
- num=abs(ed-vd);
- ans1=min(ed,vd);
- ans2=max(ed,vd);
- }
- }
- }
- cout<<ans1<<" "<<ans2<<endl;
- }
- }
-
- signed main()
- {
- //ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
- int t = 1;
- //cin>>t;
- while (t --){
- sovle();
- }
-
- return 0;
- }
B.Hcode OnlineJudge
随便模拟一下就找到规律了(被多组数据狠狠教育了
- #include<bits/stdc++.h>
- #define endl '\n'
- #define mk make_pair
- #define int long long
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> PII;
- const int N = 1e6+10;
- int n,m,k;
-
-
- void sovle(){
- while(scanf("%d %d",&n,&m)){
- if(!n&&!m) return;
- cout<<n+m-2<<endl;
- }
- }
-
- signed main()
- {
- ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
- int t = 1;
- //cin>>t;
- while (t --){
- sovle();
- }
-
- return 0;
- }
C.Hcode OnlineJudge
要使疲劳度最小,必然要找k组相邻的最小差值对,考虑n方的dp,i,j表示前i个物品取k对,注意考虑怎么初始化
- #include<bits/stdc++.h>
- #define endl '\n'
- #define mk make_pair
- #define int long long
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> PII;
- const int N = 1e6+10;
- const int inf = 0x3f3f3f3f;
- int n,m,k;
-
- int f(int x,int y){
- return (x-y)*(x-y);
- }
-
- void sovle(){
- while(cin>>n>>k){
- int a[n+1];
- for(int i=1;i<=n;i++) cin>>a[i];
- sort(a+1,a+n+1);
- int dp[n+1][k+1];
- for(int i=0;i<=n;i++){
- for(int j=0;j<=k;j++){
- if(i==0||j==0) dp[i][j]=0;
- else dp[i][j]=inf;
- }
- }
- for(int i=2;i<=n;i++){
- for(int j=1;j*2<=i&&j<=k;j++){
- dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+f(a[i-1],a[i]));
- }
- }
- cout<<dp[n][k]<<endl;
- }
- }
-
- signed main()
- {
- ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
- int t = 1;
- //cin>>t;
- while (t --){
- sovle();
- }
-
- return 0;
- }
D.Hcode OnlineJudge
水题
- #include<bits/stdc++.h>
- #define endl '\n'
- #define mk make_pair
- #define int long long
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> PII;
- const int N = 1e6+10;
- int n,m,k;
-
-
- void sovle(){
- int sum=0;
- cin>>n;
- vector<int>a(n);
- for(int i=0;i<n;i++) {cin>>a[i];if(a[i]>10) sum+=a[i]-10;}
- cout<<sum<<endl;
- }
-
- signed main()
- {
- ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
- int t = 1;
- //cin>>t;
- while (t --){
- sovle();
- }
-
- return 0;
- }
F.Hcode OnlineJudge
对于每组,只有取左边或者右边,等同于对左边,取或者不取。数据范围很小,二进制枚举秒了
- #include<bits/stdc++.h>
- #define endl '\n'
- #define mk make_pair
- #define int long long
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> PII;
- const int N = 1e6+10;
- int n,m,k;
-
-
- void sovle(){
- cin>>n>>m;
- vector<int>a(m),b(m);
- for(int i=0;i<m;i++) cin>>a[i]>>b[i];
- cin>>k;
- vector<int>c(k),d(k);
- int max1=-1;
- for(int i=0;i<k;i++) cin>>c[i]>>d[i];
- for(int i=0;i<(1<<k);i++){
- map<int,int>v,x;
- for(int j=0;j<k;j++){
- if((i>>j)&1){
- v[c[j]]=1;
- }else{
- v[d[j]]=1;
- }
- }
- int sum=0;
- for(int i=0;i<m;i++){
- if(v[a[i]]&&v[b[i]]){
- sum++;
- }
- }
- max1=max(max1,sum);
- }
- cout<<max1<<endl;
- }
-
- signed main()
- {
- ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
- int t = 1;
- //cin>>t;
- while (t --){
- sovle();
- }
-
- return 0;
- }
I.Hcode OnlineJudge
给一个小于1e18的正整数,询问能否通过删除最少的位数让该数被3整除。类似的,二进制枚举当前位数删或者不删
- #include<bits/stdc++.h>
- #define endl '\n'
- #define mk make_pair
- #define int long long
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> PII;
- const int N = 1e6+10;
- int n,m,k;
-
-
- void sovle(){
- string s;
- cin>>s;
- int n=s.size();
- int num=-1;
- for(int i=0;i<(1<<n);i++){
- map<int,int>v;
- for(int j=0;j<n;j++){
- if((i>>j)&1){
- v[j]=1;
- }
- }
- int u=0;
- int x=1;
- int sum=0;
- for(int i=n-1;i>=0;i--){
- if(v[n-1-i]) {sum++;continue;}
- u+=x*(s[i]-'0');
- x*=10;
- }
- if(u%3==0&&u){
- if(num==-1) num=sum;
- else num=min(sum,num);
- }
- }
- cout<<num<<endl;
- }
-
- signed main()
- {
- ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
- int t = 1;
- //cin>>t;
- while (t --){
- sovle();
- }
-
- return 0;
- }