cordforce Educational Codeforces Round 47 补题笔记 <未完>

题目链接

http://codeforces.com/contest/1009

A. Game Shopping

直接模拟即可,用了一个队列来存储账单

#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;

const int MAX = 1010;

queue<int> bill;
int c[MAX];
int main(){
    int gameNum, billNum;
    cin >> gameNum >> billNum;
    int t;
    for(int i = 0; i < gameNum; i++) cin >> c[i];
    for(int i = 0; i < billNum; i++){
        cin >> t;
        bill.push(t);
    }
    int ans = 0;
    int x = bill.front();
    for(int i = 0; i < gameNum; i++){
        if(x >= c[i]){
            ans++;
            bill.pop();
            if(bill.empty()) break;
            x = bill.front();
        }
    }
    cout << ans << endl;
}

 B. Minimum Ternary String

思维题

题意是10可以互换位置,12可以互换位置,求将输入序列转为最小字典序

可以发现,1是可以处于序列中任何位置的,因此我们记录1的数量,构造这样一个序列

在第一个2前插入所有1,这样能使的2全部往后靠到最后

注意不要忽略没有2的序列情况

#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long

using namespace std;

int const MAX = 100100;

int main(){
    int a[MAX];
    char c;
    int len = 0;
    while((c = getchar()) != '\n'){
        a[len++] = c - '0';
    }
    int oneNum = 0;
    for(int i = 0; i < len; i++){
        if(a[i] == 1){ 
            oneNum++; 
        }//1可以放置于任意位置,先全部取出
    }
    for(int i = 0; i < len; i++){
        if(a[i] == 0){
            cout << 0;
        }
        else if(a[i] == 2){
            while(oneNum){
                cout << 1;
                oneNum--;
            }
            cout << 2;
        }
    }
    while(oneNum){
        cout << 1;
        oneNum--;
    }
    cout << endl;
}

C. Annoying Present

通过特定变换使得数列平均值达到最大

只要稍微分类一下就可以计算出各种情况

应该考虑精度问题,使用cout应该设置精度

#include <iostream>
#include <algorithm>
#include <iomanip>
#define ll long long
using namespace std;

const int MAX = 100100;

ll sum(int n){
    ll ans = 0;
    for(int i = 1; i <= n; i++){
        ans+=i;
    }
    return ans;
}

int main(){
    ll x, d;
    ll ans = 0, n, m;
    cin >> n >> m;
    ll t1 = sum(n-1);
    if(n%2 == 1){
        ll t2 = sum((n-1)/2);
        for(int i = 0; i < m; i++){
            cin >> x >> d;
            ans+=x*n;
            if(d >= 0){
                ans+=d*t1;
            }
            else{
                ans += 2*d*t2;
            }
        }
    }
    else{
        ll t2 = sum(n/2-1);
        for(int i = 0; i < m; i++){
            cin >> x >> d;
            ans+=x*n;
            if(d >= 0){
                ans+=d*t1;
            }
            else{
                ans += 2*d*t2+n*d/2;
            }
        }
    }
    cout.precision(10);
    cout << ans*1.0/n << endl;
}

 

posted @ 2018-07-27 02:32  Phoenix_Xie  阅读(322)  评论(0编辑  收藏  举报