Codeforces Round #284(Div.2) A,B,C解题报告

转载请注明出处:
http://blog.csdn.net/wybluewind/article/details/47756905

codeforces 上的题解:http://codeforces.com/blog/entry/15353

A. Watching a movie

题目大意:
        播放器上有两个按钮,一个是看当前一分钟的电影,另一个是跳过x分钟,即如果当前播放的是第t分钟,按完这个按钮就跳到了(t+x)分钟。给出一个电影的多个高潮部分要全部看完,至少要看多少分钟。

思路:
        简单题,标记当前的播放分钟数,找到离下一个高潮开始时间最近的可以跳到的时间点,这个时间点就是需要开始看的最早时间。加上此时间到结束的时间差「不要忘了要+1」,把当前时间标记未结束时间的下一分钟,继续循环就行了。

代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<utility>
    #include<algorithm>
    using namespace std;

    int n,x;
    pair<int , int> best[55];

    int main()
    {
    //    freopen("in.txt","r",stdin);
        while(cin >> n >> x){
            for(int i=0; i<n; ++i){
                cin >> best[i].first >> best[i].second;
            }
            sort(best,best+n);
            int st = 1;
            int ans=0;
            for(int i=0; i<n; ++i){
                int diff = best[i].first-st;
                ans += diff - diff/x * x + best[i].second-best[i].first+1;
                st = best[i].second+1;
            }
            printf("%d\n",ans);
        }
        return 0;
    }


B. Lecture

题目大意:
        给出1和2两种语言同意单词的对照表,给出第1种语言的多个单词,如果第2种语言同意单词比这个短,则用第2种语言的此单词代替。输出替换后的结果。

思路:
        利用map存1和2种语言的对照,输入存到string数组里,一个个判断,若小则替换。在输出就好了。

代码:

    #include<iostream>
    #include<string>
    #include<cstdio>
    #include<cstring>
    #include<cstdio>
    #include<map>
    using namespace std;

    int n,m;
    map<string, string> mp;
    string content[3009];

    int main()
    {
    //    freopen("in.txt","r",stdin);
        while(cin >> n >> m){
            for(int i=0; i<m; ++i){
                string s1,s2;
                cin >> s1 >> s2;
                mp[s1]=s2;
            }
            for(int i=0; i<n; ++i)
                cin >> content[i];

            for(int i=0; i<n; ++i){
                int len1 = content[i].size();
                int len2 = mp[content[i]].size();
                if(len1>len2)
                    content[i] = mp[content[i]];
            }
            cout << content[0] ;
            for(int i=1; i<n; ++i){
                cout << " " << content[i];
            }
            printf("\n");
        }
        return 0;
    }


C. Crazy Town

题目大意:
        平面上用n条直线,不平行与坐标轴。这些直线把平面分成多个区域,给位于区域内的两个点,问从一个点到另一个点需要穿过多少个区域。

思路:
        数学题,换一个角度,如果这两个点在一条直线的两侧,那么这条直线一定要穿过。穿过一条直线就意味着,需要多走一个区域。所以直接判断这两个点都位于哪些直线的两侧,即可。注意:数字会很大!!

代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;

    struct Node{
        long long a,b,c;
        Node(){a=0; b=0; c=0;}
    }p1,p2;
    int n;
    Node coeff[309];

    int main()
    {
    //    freopen("in.txt","r",stdin);
        while(cin >> p1.a >> p1.b){
            cin >> p2.a >> p2.b;

            cin >> n;
            for(int i=0; i<n; ++i)
                cin >> coeff[i].a >> coeff[i].b >> coeff[i].c;

            int ans=0;
            for(int i=0; i<n; ++i){
                long long r1 = coeff[i].a*p1.a + coeff[i].b*p1.b + coeff[i].c;
                long long r2 = coeff[i].a*p2.a + coeff[i].b*p2.b + coeff[i].c;
                if((r1<0 && r2>0) || (r1>0 && r2<0))
                    ans++;
            }
            cout << ans << endl;
        }
        return 0;
    }


D. Name That Tune
         求概率问题,对不起,我怂了放弃这题了。完全没思路,等后面在慢慢看。

大概是个dp的问题。Mark!

这里是codeforces上的题解:http://codeforces.com/blog/entry/15353

E. Array and Operations
         本来以为是个数学问题,wa了一发发现错了,想得太简单了。细思急恐! 竟然是个匹配的问题,也放弃了,以后再来解决!!!

题解上面也有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值