Codeforces Round #350 (Div. 2)

传送门:http://codeforces.com/contest/670

A. Holidays

题意:一个星球 五天工作,两天休息。给你一个1e6的数字n,问你最少和最多休息几天。
思路:最少休息的天数肯定是刚刚休息好工作的节奏。只需判断n % 7 的余数如果小于等于5就是n/7,否则就是 n/7 + 1;
最多的休息天数是先休息两天,在按照上面的思路做就行。

#include<bits/stdc++.h>
using namespace std;
int main ()
{
    //yyy_3y
    int n; cin >> n;
    int tmp = n/7;
    if (n == 1) cout << 0 << " " << 1 <<endl;
    else {

        if (n % 7 <= 5) cout << tmp*2 << " ";
        else cout << tmp*2+1<< " ";
        n = n-2;
        tmp = n/7;
        if (n % 7 <= 5) cout << tmp*2+2;
        else cout << tmp*2+1+2;

    }
     return 0;
}

B. Game of Robots

题意:第一个机器人报自己的编号;第二个报前一个机器人和自己的编号;第三个机器人报前两个机器人和自己的编号。以此类推。
每个机器人一个编号。问k个报什么。
思路:看下n的范围,手动遍历毫无压力。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[110000];
int main ()
{
    //yyy_3y
    int n,k;
    scanf("%d%d",&n,&k);
    for(int j=1;j<=n;j++)
        scanf("%d",&a[j]);
    for(int i=1;i<=n;i++) {
        if(k>i)  k=k-i;
        else  return 0*printf("%d\n",a[k]);
    }

}

C. Cinema

题意:有n个人,每个人只会一种语言(不同编号表不同语言)。
现在有m部电影,每部电影的声音是a[i],字幕是b[i]。(a[i]输入完输入b[i])
如果听得懂声音,他会非常满意,如果字幕他能看懂的话他会比较满意,否则它很不满意。
现在问看哪部电影会使得n个人满意最高(如果两部电影使n个人非常满意的人数相同时,选比较满意的最多的)。
思路:a[i]非常的大,一开始想离散化求解。想想可以map存方便些。
O(n)找到非常满意的,O(n)比较下非常满意总比较满意的数量。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<int,int> mp;
int a[210000];
struct Node
{
    int x,y;
}p[210000];
int main ()
{
    //yyy_3y
   int n; cin >> n;
   for (int i = 1; i <= n; i++) {
        cin >>a[i];
        mp[a[i]] ++;
   }
   int m; cin >>m;
   for (int i = 1; i <= m; i++) cin >>p[i].x;
   for (int i = 1; i <= m; i++) cin >>p[i].y;

   int cc = 0, index = 1;
   for (int i = 1; i<= m; i++){
        if (cc < mp[p[i].x]){
            cc = mp[p[i].x];
            index = i;
        }
   }
   int pp = 0;
    for (int i = 1; i<= m; i++){
        if (cc == mp[p[i].x]){
            if (pp < mp[p[i].y]){
                 pp =mp[p[i].y];
                 index = i;
            }

        }
   }
   cout << index <<endl;

}

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<map>
#include<cstdlib>
using namespace std;
typedef double db;
typedef long long ll;
const int MAXN = 200005;
map<int,int> mp;
int b[MAXN],c[MAXN];
int main ()
{
    int n; scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int a; scanf("%d",&a);
        mp[a]++;
    }
    int m; scanf("%d",&m);
    for(int i=1;i<=m;i++) scanf("%d",&b[i]);
    for(int i=1;i<=m;i++) scanf("%d",&c[i]);
    int lo = 1;
    for (int i=1;i<=m;i++){
        if(mp[b[i]] > mp[b[lo]] || (mp[b[i]] == mp[b[lo]] && mp[c[i]] > mp[c[lo]])) lo = i;
    }
    printf("%d\n",lo);
    return 0;
}

赛中和赛后的学习,思路更加清晰,时间快了3倍。

D. Magic Powder

题意:做一个蛋糕需要n个原材料,现有k个魔法材料,魔法材料可以替代成任何材料,现在告诉你蛋糕每个材料需要多少,以及你现在有多少个,问你最多能够做出多少个蛋糕来。
思路:二分枚举。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll a[110000],b[110000];
const ll maxn = 1e9 * 3;

ll n,k;
ll solve (ll l,ll r)
{
    while (l <= r){
        ll sum =0;
        ll mid = (l+r) /2;
    //    printf("%lld\n",mid);
        for(ll i = 1; i <= n ;i++){
            if (a[i]*mid - b[i] > 0) sum += a[i]*mid - b[i];
      //      printf("sum = %lld\n",a[i]*mid - b[i]);
            if (sum > k) break;
        }
        if (sum == k) return mid;
        else if (sum < k) l = mid +1;
        else r = mid -1;
    }
    return r;
}
int main ()
{
    //yyy_3y
     scanf("%lld %lld",&n,&k);
    for(int i = 1; i <= n; i++) scanf("%lld",&a[i]);
    for(int i = 1; i <= n; i++) scanf("%lld",&b[i]);
    printf("%lld\n",solve(1,maxn));

}

比赛写的代码真的不咋漂亮,简单写法。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<map>
#include<cstdlib>
using namespace std;
typedef double db;
typedef long long ll;
const int MAXN = 100005;
ll b[MAXN],a[MAXN];
int main ()
{
    int n,k; scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++) scanf("%I64d",&a[i]);
    for(int i=1;i<=n;i++) scanf("%I64d",&b[i]);
    ll l=0,r=2e9+10;
    while (l<r){
        ll m=(l+r+1)/2,tot=0;
        for(int i=1;i<=n && tot<=k;i++)
            tot+=max(0LL,a[i]*m-b[i]);
        if(tot>k) r=m-1;
        else l=m;
    }
    printf("%I64d",l);
    return 0;
}

E. *Correct Bracket Sequence Editor

题意:给你长度5e5的括号字符,m个操作,光标初始位置是p.
‘L’操作表示左移光标,’R’操作表示右移光标’D’操作表示删除当前光标所在的字符对应的括号字符以内的所有字符。删除操作后光标右移,如果右边没有,那么到尾上,问做完所有操作以后输出什么。
思路:链表。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<map>
#include<cstdlib>
#include<stack>
#include<list>
using namespace std;
typedef double db;
typedef long long ll;
const int MAXN = 500005;
char s[MAXN], op[MAXN];
stack<int> skt;
list<int>lk;
typedef list<int>::iterator ptr;
int sv[MAXN];
int main ()
{
    freopen("1.in","r",stdin);
    int n,m,p;
    scanf("%d%d%d%s%s",&n,&m,&p,s+1,op+1);
    for (int i=1;i<=n;i++){
        if(s[i]=='(') skt.push(i);
        else {
            sv[i]=skt.top();
            sv[skt.top()]=i;
            skt.pop();
        }
    }
    for(int i=1;i<=n;i++) lk.push_back(i);
    ptr r = lk.begin();
    for(int i=1;i<p;i++) r++;
    for(int i=1;i<=m;i++){
        if (op[i]=='R') r++;
        else if(op[i]=='L') r--;
        else {
            ptr l=r;
            if(sv[*r]<*r) while (sv[*r]!=*l) l--;
            else while (sv[*l]!=*r) r++;
            while (l!=r) lk.erase(l++);
            lk.erase(r++);
            if (r == lk.end()) r--;
        }
    }
   // printf(" 1");
    for (ptr lo=lk.begin();lo!=lk.end();lo++)
        printf("%c",s[*lo]);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值