编程语言
首页 > 编程语言> > “科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛

“科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛

作者:互联网

A 张老师和菜哭武的游戏
题目中有描述“当且仅当集合存在y和z,满足x等于y+z或者y-z”
所以考虑y-z,很容易想到辗转相减法,所以最小项是最大公约数
然后题目就迎刃而解了

#include <bits/stdc++.h>
using namespace std;
int n,a,b;
 
int gcd(int a,int b){
    if(a==b)return a;
    return a>b?gcd(a-b,b):gcd(b-a,a);
}
 
int main(){
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b;
        int temp=gcd(a,b);
        int ans=n/temp;
        if(ans%2==1) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

B 伤害计算
看了题解,觉得还是用atoi更加简单;
atoi主要用来将数字字符串转变为对应的整型数字,具体用法网上教程很多;
数学期望的计算公式是用各项权值乘以概率,常数的数学期望就是常数,公式推导还是挺简单的;
注意题目中小数只有.5,所以方便计算,可以将各项结果先乘以2,最后除2,看余数决定是否输出.5;
ps:字符串题目多用函数可以减少很多时间;

#include <bits/stdc++.h>
using namespace std;
const int MAXL=6000;
char strfuc[MAXL];
int ans;

void opera(char *str){
    char *D=strchr(str,'d');
    if(D==NULL){
        int c=atoi(str);
        ans+=2*c;
        //cout<<c<<endl;
    }else{
        *D='\0';
        int n=atoi(str);
        int x=atoi(D+1);
        ans+=n*(x+1);
        //cout<<n<<" "<<x<<endl;
    }
}

int main(){
    while(cin>>strfuc){
        ans=0;
        char* str=strfuc;
        while(1){
            char* ps=strchr(str,'+');
            if(ps==NULL){
                opera(str);
                break;
            }else{
                *ps='\0';
                opera(str);
                str=ps+1;
            }
        }
        cout<<ans/2;
        if(ans%2) cout<<".5"<<endl;
        else cout<<endl;
    }
    return 0;
}

C 张老师的旅行
直觉上感觉可以用贪心去做;
结果wa了;
仔细想想还是不行,跟任务分配问题还是有区别的;
这道题dp还是比较难想的;
通俗的讲:
比如你在起点位置,你左边有i个景点,右边有j个景点,问题就是问你浏览完所有景点的最小时间;
首先你不管以什么顺序浏览,你要么最后停在i点,要么最后停在j点;
所以要分两种情况来讨论;
以最后停在i点为例;
这个问题的子问题,比如浏览完左边的i-1个景点,右边的j个景点的最短时间已经求得;
那么对于子问题两种情况的可行解(一种停在i-1点,一种停在j点),你都要回到i点,那么加上对应的路程就可以了(想象你从i-1出发走到i,或从j出发走到i);
然后问题的解就是两种情况的最小的那一个;
然后ac的代码;

#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f;
struct point{
    int deadline;
    int coordinate;
};
point mp[1100];
point leftpointSet[1100];
point rightpointSet[1100];
int dp[1100][1100][2];

bool cmp(point a,point b){
    return a.coordinate<b.coordinate;
}

int main(){
    int n;
    cin>>n;
    int my_coordinate;
    for(int i=1;i<=n;i++){
        cin>>mp[i].coordinate;
    }
    for(int i=1;i<=n;i++){
        cin>>mp[i].deadline;
        if(mp[i].deadline==0) my_coordinate=i;
    }
    sort(mp+1,mp+1+n,cmp);
    memset(dp,INF,sizeof(dp));
    dp[0][0][1]=0;
    dp[0][0][0]=0;
    int cnt_left=0,cnt_right=0;
    for(int i=my_coordinate-1;i>0;i--){
        cnt_left++;
        leftpointSet[cnt_left].coordinate=abs(mp[i].coordinate-mp[my_coordinate].coordinate);
        leftpointSet[cnt_left].deadline=mp[i].deadline;
    }
    for(int i=my_coordinate+1;i<=n;i++){
        cnt_right++;
        rightpointSet[cnt_right].coordinate=abs(mp[i].coordinate-mp[my_coordinate].coordinate);
        rightpointSet[cnt_right].deadline=mp[i].deadline;
    }
    /*
    cout<<my_coordinate<<endl;
    for(int i=1;i<=cnt_left;i++) cout<<leftpointSet[i].coordinate<<" ";
    cout<<endl;
    for(int j=1;j<=cnt_right;j++) cout<<rightpointSet[j].coordinate<<" ";
    cout<<endl;
    */
    for(int i=0;i<=cnt_left;i++){
        for(int j=0;j<=cnt_right;j++){
            if(i){
                dp[i][j][0]=min(dp[i-1][j][0]-leftpointSet[i-1].coordinate+leftpointSet[i].coordinate,dp[i-1][j][1]+rightpointSet[j].coordinate+leftpointSet[i].coordinate);
            }
            if(j){
                dp[i][j][1]=min(dp[i][j-1][1]-rightpointSet[j-1].coordinate+rightpointSet[j].coordinate,dp[i][j-1][0]+leftpointSet[i].coordinate+rightpointSet[j].coordinate);
            }
            if(dp[i][j][0]>leftpointSet[i].deadline && dp[i][j][1]>rightpointSet[j].deadline){
                cout<<-1<<endl;
                return 0;
            }
            if(dp[i][j][0]>leftpointSet[i].deadline) dp[i][j][0]=INF;
            if(dp[i][j][1]>rightpointSet[j].deadline) dp[i][j][1]=INF;

        }
    }
     cout<<min(dp[cnt_left][cnt_right][0],dp[cnt_left][cnt_right][1])<<endl;
     return 0;
}

标签:str,int,deadline,mp,科大,飞杯,coordinate,友谊赛,dp
来源: https://blog.csdn.net/yhyxzywl/article/details/106039020