2019 ACM训练计划——( 每天5题 ) 训练计划16

A

Codeforces Round #274 (Div. 2), problem: © Exams


题目大意

一个大学生,要参加n场考试,但是他想尽快的把所有考试都考完。对于第 i 场考试,老师规定的时间是ai, 他自己安排的时间是bi ,且ai > bi 。现在有一个原则,你的考试时间顺序不能和老师安排的每场考试时间的先后顺序不一致,且这个学生可以在同一时间完成无穷多的考试。问他完成全部考试的最早时间是多少。


题解

贪心。先按老师给的时间升序给所有考试排序,当时间相等时,按学生给出的时间升序排序。用ans纪录上一次考试结束时间,下一场的考试结束时间肯定要大于上一场的考试结束时间。 最后输出ans即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn=5005;
struct node{
    int a,b;
}stu[maxn];
int n;
int cmp(node x,node y){
    if(x.a==y.a)
        return x.b<y.b;
    else
        return x.a<y.a;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>stu[i].a>>stu[i].b;
    sort(stu,stu+n,cmp);
    int ans=-1;
    for(int i=0;i<n;i++){
        if(stu[i].a<=stu[i].b&&stu[i].a>=ans)
            ans=stu[i].b;
        else if(stu[i].b<stu[i].a&&stu[i].b>=ans)
            ans=stu[i].b;
        else
            ans=max(stu[i].a,stu[i].b);
    }
    cout<<ans<<endl;
    return 0;
}

B

Codeforces Round #306 (Div. 2), problem: (A) Two Substrings


题目大意

给出一行字符,判断是否出现两个不重叠的字串“AB”和“BA”


题解

判断字符串中是否包含某个特定的子串,用strstr函数即可。另外注意要求不存在叠加的情况,可以用指针实现移位

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
char s[maxn];
int main(){
    cin>>s;
    char *c;
    if((c=strstr(s,"AB"))!=NULL&&(strstr(c+2,"BA"))!=NULL)
        cout<<"YES"<<endl;
    else if((c=strstr(s,"BA"))!=NULL&&(strstr(c+2,"AB")!=NULL))
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;
    return 0;
}

C

Codeforces Round #171 (Div. 2), problem: (B) Books


题目大意

给定时间t以及每本书所需阅读时间,问在连续区间最多能读多少本书


题解

刚开始以为是贪心,然后后面读了几次题后,发现是连续的去读,只要选择了一本了,后面就跟着连续读 我们可以用尺取法求解

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,a[maxn],t;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>t;
    for(int i=0;i<n;i++)
        cin>>a[i];
    int j=0,sum=0,cnt=0,res=0;
    for(int i=0;i<n;i++){
        while(j<n){
            if(sum+a[j]>t) break;
            sum+=a[j++];
        }
        res=max(res,j-i);
        sum-=a[i];
    }
    cout<<res<<endl;
    return 0;
}

D

Codeforces Round #271 (Div. 2), problem: (D) Flowers


题目大意

土拨鼠???反正大概意思是拿红花或者k个白花,那么对于dp [ i ] =dp [ i - 1 ] + dp [ i - k ] 对于第 i 个长度 可以是之前最后一个红花或者k个白花


题解

题目给你的a 和 b 是一个区间范围的方法值 所以我们对我们求出的dp数组还要求一个前缀和 然后方法数很多很多,记得要取模!

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int mod=1e9+7;
int t,k,a,b;
int dp[maxn],sum[maxn];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>t>>k;
    dp[0]=1;
    sum[0]=0;
    for(int i=1;i<=maxn;i++){
        dp[i]+=dp[i-1];
        if(i>=k){
            dp[i]+=dp[i-k];
            dp[i]%=mod;
        }
        sum[i]=(sum[i-1]+dp[i])%mod;
    }
    while(t--){
        cin>>a>>b;
        cout<<(sum[b]-sum[a-1]+mod)%mod<<endl;
    }
    return 0;
}

E

Codeforces Alpha Round #20 (Codeforces format), problem: © Dijkstra?


题目大意

求最短路径


题解

套用堆优化版的Dijkstra 然后需要记录每一次的路径 然后打印

这道题我一开始定义INF直接定义为0x3f3f3f3f,但是我发现这样会一直报错???不知道是为啥,我觉得应该是可以的,毕竟INF是long long64位,,而且这个错误它还不提醒的,直接跑程序的时候会直接卡住然后结束。后来就直接手写了一个10的11次方+5,因为最多有10 ^ 5个点,每个点之间的线最大是10 ^ 6,乘起来就是10^11

最后直接秒AC了,WTF???

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
const ll INF=100000000005;
const int maxn=1e5+10;
int pre[maxn];
ll res[maxn];

struct node{
    ll v,len;
    node(ll v=0,ll len=0):v(v),len(len){}
    bool operator < (const node &a)const{
        return len>a.len;
    }
};
vector<node> G[maxn];
bool vis[maxn];
ll dis[maxn];
void init(){
    for(int i=0;i<maxn;i++){
        G[i].clear();
        vis[i]=false;
        dis[i]=INF;
    }
}
void dijkstra(int s,int e){
    priority_queue<node> Q;
    Q.push(node(s,0));
    dis[s]=0;
    while(!Q.empty()){
        node now=Q.top();
        Q.pop();
        int v=now.v;
        if(vis[v]) continue;
        vis[v]=true;
        for(int i=0;i<G[v].size();i++){
            int v2=G[v][i].v;
            int len=G[v][i].len;
            if(!vis[v2]&&dis[v2]>dis[v]+len){
                dis[v2]=dis[v]+len;
                pre[v2]=v;
                Q.push(node(v2,dis[v2]));
            }
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    init();
    for(int i=0;i<m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        G[u].push_back(node(v,w));
        G[v].push_back(node(u,w));
    }
    dijkstra(1,n);
    int now=n,cnt=0;
    if(dis[n]>=INF){
        cout<<-1<<endl;
        return 0;
    }
    while(now!=1){
        res[cnt++]=now;
        now=pre[now];
    }
    cout<<"1 ";
    for(int i=cnt-1;i>=0;i--)
        cout<<res[i]<<" ";
    cout<<endl;
    return 0;
}
学如逆水行舟,不进则退
一百个Chocolate CSDN认证博客专家 CSDN博客专家 博客之星 前端开发攻城狮
JS,TS,LeetCode,Vue,React,算法爱好者。
主要分享前端知识,立志成为优秀前端博主。
座右铭:学如逆水行舟,不进则退!
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值