首页 > 其他 > 详细

Benelux Algorithm Programming Contest 2019 解题与补题报告

时间:2020-03-26 13:16:12      阅读:44      评论:0      收藏:0      [点我收藏+]

B题,很简单的一道思维题,但是当时读错题导致看了好久,审题还应该仔细啊;

J题,给一个数,让找另外一个数和给的数相乘不是某个数的平方的倍数,根据题意这个数是几个素数的乘积,我们只要找到这些素数,在找另外一个不和这些素数相同的素数就可以;

代码:

#include<bits/stdc++.h>
using namespace std;
vector<int>p;
int isp(int n)
{
    int l=sqrt(n);
    if(n==2||n==1)return 1;
    for(int i=2;i<=l;i++)
    {
        if(n%i==0)return 0;
    }
    return 1;
    
}
int a[100005];


int find(int n)
{
    int l=p.size();
    if(l==0)return 0;
    for(int i=0;i<l;i++)
    {
        if(p[i]==n)return 1;
    }
    return 0;
}
int main()
{
for(int i=2;i<100002;i++)
{
    a[i]=isp(i);
}
    int n;
    cin>>n;
    int l=sqrt(n);
    for(int i=2;i<=l;i++)
    {
        if(n%i==0){
            p.push_back(i);
            p.push_back(n/i);
        }
    }
    for(int i=2;i<n;i++)
    {
        if(a[i]==1&&find(i)==0)
        {
            cout<<i;
            break;
        }
    }
    
 } 

E题,给一个数字,让找最小的钱数,钱的面值是由10的倍数(包括一)组成的,问最少可以交换多少张钱币数,

有两种方式找钱,一种是直接给比如5元就给5个1元的,还有就是给比它大一面值的在找钱,比如8,给一张10元的,找2张1元的;

当时一个队友说了思路我写出来但是过不了qwq,找了好多例子都可以但是还是不行就放弃了,

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin>>s;
    int ans=0;
    int l=s.length();
    int flag=0;
    for(int i=0;i<l;i++)
    {
        if(s[i]-0<5)
        {
            if(flag==1)ans++;
            ans+=s[i]-0;
            flag=0;
        }
        else
        {
        //    if(flag==0&&s[i]==‘5‘&&s[i-1]!=‘5‘)flag=0;
        //    else 
            flag=1;
    
            if(i==l-1||s[i+1]<5)
            {
                ans+=10-s[i]+0;
            //    cout<<ans<<endl;
            }
            else ans+=10-s[i]+0-1;
        }
    }
    if(flag==1)ans++;
    cout<<ans;
}

看题解是用dp做的,找递推式 dp[i+1][0]=min(dp[i][0]+s[i]-‘0‘,dp[i][1]+10-s[i]+‘0‘)     dp[i+1][1]=min(dp[i][0]+s[i]-‘0‘+1,dp[i][1]+10-s[i]+‘0‘-1)

说实话当时根本没想到这题可以用dp做,也没想用dp;

代码:

#include<iostream> 
#include<cstring> 
using namespace std; 
int dp[10005][2]; 
int main(){    
    char s[10005];     
    scanf("%s",s);    
    dp[0][1]=1;    
    dp[0][0]=0;    
    for(int i=0;i<strlen(s);i++){        
         dp[i+1][0]=min(dp[i][0]+s[i]-0,dp[i][1]+10-s[i]+0);
         dp[i+1][1]=min(dp[i][0]+s[i]-0+1,dp[i][1]+10-s[i]+0-1);
    }     
    printf("%d",dp[strlen(s)][0]);
    return 0;
}

 

Benelux Algorithm Programming Contest 2019 解题与补题报告

原文:https://www.cnblogs.com/Kingstar1/p/12573537.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!