SMU Summer 2024 Contest Round 3

A.Hcode OnlineJudge

 先用欧拉筛把质数预处理出来,然后枚举左端点的质数,只需要询问右端点是不是质数并取差值的min就行了

  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. #define mk make_pair
  4. #define int long long
  5. using namespace std;
  6. typedef long long ll;
  7. typedef pair<int, int> PII;
  8. const int N = 1e6+10;
  9. int n,m,k;
  10. vector<int>pri;
  11. bool su[10005];
  12. void get(){
  13. for(int i=2;i<=10000;i++){
  14. if(!su[i]) pri.push_back(i);
  15. for(auto ed:pri){
  16. if(i*ed>10005) break;
  17. su[ed*i]=1;
  18. if(i%ed==0) {break;}
  19. }
  20. }
  21. }
  22. void sovle(){
  23. get();
  24. while(scanf("%d",&n)!=EOF){
  25. int ans1=0,ans2=0,num=1000000;
  26. for(auto ed:pri){
  27. if(!su[abs(n-ed)]){
  28. int vd=abs(n-ed);
  29. if(abs(ed-vd)<num){
  30. num=abs(ed-vd);
  31. ans1=min(ed,vd);
  32. ans2=max(ed,vd);
  33. }
  34. }
  35. }
  36. cout<<ans1<<" "<<ans2<<endl;
  37. }
  38. }
  39. signed main()
  40. {
  41. //ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
  42. int t = 1;
  43. //cin>>t;
  44. while (t --){
  45. sovle();
  46. }
  47. return 0;
  48. }

B.Hcode OnlineJudge

 随便模拟一下就找到规律了(被多组数据狠狠教育了

  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. #define mk make_pair
  4. #define int long long
  5. using namespace std;
  6. typedef long long ll;
  7. typedef pair<int, int> PII;
  8. const int N = 1e6+10;
  9. int n,m,k;
  10. void sovle(){
  11. while(scanf("%d %d",&n,&m)){
  12. if(!n&&!m) return;
  13. cout<<n+m-2<<endl;
  14. }
  15. }
  16. signed main()
  17. {
  18. ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
  19. int t = 1;
  20. //cin>>t;
  21. while (t --){
  22. sovle();
  23. }
  24. return 0;
  25. }

C.Hcode OnlineJudge

 要使疲劳度最小,必然要找k组相邻的最小差值对,考虑n方的dp,i,j表示前i个物品取k对,注意考虑怎么初始化

  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. #define mk make_pair
  4. #define int long long
  5. using namespace std;
  6. typedef long long ll;
  7. typedef pair<int, int> PII;
  8. const int N = 1e6+10;
  9. const int inf = 0x3f3f3f3f;
  10. int n,m,k;
  11. int f(int x,int y){
  12. return (x-y)*(x-y);
  13. }
  14. void sovle(){
  15. while(cin>>n>>k){
  16. int a[n+1];
  17. for(int i=1;i<=n;i++) cin>>a[i];
  18. sort(a+1,a+n+1);
  19. int dp[n+1][k+1];
  20. for(int i=0;i<=n;i++){
  21. for(int j=0;j<=k;j++){
  22. if(i==0||j==0) dp[i][j]=0;
  23. else dp[i][j]=inf;
  24. }
  25. }
  26. for(int i=2;i<=n;i++){
  27. for(int j=1;j*2<=i&&j<=k;j++){
  28. dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+f(a[i-1],a[i]));
  29. }
  30. }
  31. cout<<dp[n][k]<<endl;
  32. }
  33. }
  34. signed main()
  35. {
  36. ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
  37. int t = 1;
  38. //cin>>t;
  39. while (t --){
  40. sovle();
  41. }
  42. return 0;
  43. }

D.Hcode OnlineJudge

水题

  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. #define mk make_pair
  4. #define int long long
  5. using namespace std;
  6. typedef long long ll;
  7. typedef pair<int, int> PII;
  8. const int N = 1e6+10;
  9. int n,m,k;
  10. void sovle(){
  11. int sum=0;
  12. cin>>n;
  13. vector<int>a(n);
  14. for(int i=0;i<n;i++) {cin>>a[i];if(a[i]>10) sum+=a[i]-10;}
  15. cout<<sum<<endl;
  16. }
  17. signed main()
  18. {
  19. ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
  20. int t = 1;
  21. //cin>>t;
  22. while (t --){
  23. sovle();
  24. }
  25. return 0;
  26. }

F.Hcode OnlineJudge

对于每组,只有取左边或者右边,等同于对左边,取或者不取。数据范围很小,二进制枚举秒了

  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. #define mk make_pair
  4. #define int long long
  5. using namespace std;
  6. typedef long long ll;
  7. typedef pair<int, int> PII;
  8. const int N = 1e6+10;
  9. int n,m,k;
  10. void sovle(){
  11. cin>>n>>m;
  12. vector<int>a(m),b(m);
  13. for(int i=0;i<m;i++) cin>>a[i]>>b[i];
  14. cin>>k;
  15. vector<int>c(k),d(k);
  16. int max1=-1;
  17. for(int i=0;i<k;i++) cin>>c[i]>>d[i];
  18. for(int i=0;i<(1<<k);i++){
  19. map<int,int>v,x;
  20. for(int j=0;j<k;j++){
  21. if((i>>j)&1){
  22. v[c[j]]=1;
  23. }else{
  24. v[d[j]]=1;
  25. }
  26. }
  27. int sum=0;
  28. for(int i=0;i<m;i++){
  29. if(v[a[i]]&&v[b[i]]){
  30. sum++;
  31. }
  32. }
  33. max1=max(max1,sum);
  34. }
  35. cout<<max1<<endl;
  36. }
  37. signed main()
  38. {
  39. ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
  40. int t = 1;
  41. //cin>>t;
  42. while (t --){
  43. sovle();
  44. }
  45. return 0;
  46. }

I.Hcode OnlineJudge

 给一个小于1e18的正整数,询问能否通过删除最少的位数让该数被3整除。类似的,二进制枚举当前位数删或者不删

  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. #define mk make_pair
  4. #define int long long
  5. using namespace std;
  6. typedef long long ll;
  7. typedef pair<int, int> PII;
  8. const int N = 1e6+10;
  9. int n,m,k;
  10. void sovle(){
  11. string s;
  12. cin>>s;
  13. int n=s.size();
  14. int num=-1;
  15. for(int i=0;i<(1<<n);i++){
  16. map<int,int>v;
  17. for(int j=0;j<n;j++){
  18. if((i>>j)&1){
  19. v[j]=1;
  20. }
  21. }
  22. int u=0;
  23. int x=1;
  24. int sum=0;
  25. for(int i=n-1;i>=0;i--){
  26. if(v[n-1-i]) {sum++;continue;}
  27. u+=x*(s[i]-'0');
  28. x*=10;
  29. }
  30. if(u%3==0&&u){
  31. if(num==-1) num=sum;
  32. else num=min(sum,num);
  33. }
  34. }
  35. cout<<num<<endl;
  36. }
  37. signed main()
  38. {
  39. ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
  40. int t = 1;
  41. //cin>>t;
  42. while (t --){
  43. sovle();
  44. }
  45. return 0;
  46. }

登录后您可以享受以下权益:

×
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他
点击体验
DeepSeekR1满血版
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回顶部