CF#304Div2

A.Soldier and Bananas

题解:注意溢出以及不需要借钱的情况。

代码实现:

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

int main()
{
    long long Sum;
    long long K,N,W;
    cin>>K>>N>>W;
    Sum = (W+1)*W/2*K;
    if( Sum >= N )
        Sum -= N;
    else
        Sum = 0;
    cout<<Sum<<endl;
    return 0;
}

B.Soldier and Badges

题解:简单的贪心。

代码实现:

#include <iostream>
#include <bits/stdc++.h>
#define MAX 3010

using namespace std;

int a[MAX];
int main()
{
    int N;
    cin>>N;
    for( int i = 0; i < N; i++ )
        scanf("%d",&a[i]);
    sort(a,a+N);
    int sum = 0;
    for( int i = 1; i < N; i++ )
    {
        if( a[i] <= a[i-1] )
        {
            sum += a[i-1]-a[i]+1;
            a[i] = a[i-1]+1;
        }
    }
    printf("%d\n",sum);
    return 0;
}

C.Soldier and Cards

题解:模拟,但是注意判断不能分出胜负的条件,比赛的时候本想记录状态潘崇,但是又觉得有点麻烦,不如挑一个不会超时的数字判断来得快一点。

代码实现:

#include <iostream>
#include <bits/stdc++.h>
#define MAX 110

using namespace std;

queue<int> q1,q2;
int show1[MAX];
int show2[MAX];
int main()
{
    int N;
    int K1,K2;
    int x,y;
    int win = 0;
    int times = 0;
    x = y = 0;
    memset(show1,0,sizeof(show1));
    memset(show2,0,sizeof(show2));
    cin>>N;
    cin>>K1;
    for( int i = 0; i < K1; i++ )
    {
        int a;
        scanf("%d",&a);
        q1.push(a);
    }
    cin>>K2;
    for( int i = 0; i < K2; i++ )
    {
        int a;
        scanf("%d",&a);
        q2.push(a);
    }
    x = q1.front();
    y = q2.front();
    q1.pop();
    q2.pop();
    while( 1 )
    {
//        if( show1[x] == q1.size() && show2[y] == q2.size() )
//            break;
//        show1[x] = q1.size();
//        show2[y] = q2.size();
        if( times >= 1000 )
            break;
        times++;
        if( x > y )
        {
            q1.push(y);
            q1.push(x);
        }
        else
        {
            q2.push(x);
            q2.push(y);
        }
        if( q1.empty() )
        {
            win = 2;
            break;
        }
        else if( q2.empty() )
        {
            win = 1;
            break;
        }
        x = q1.front();
        y = q2.front();
        q1.pop();
        q2.pop();
    }
    if( win == 0 )
        printf("-1\n");
    else
    {
        printf("%d %d\n",times,win);
    }
    return 0;
}

另一种判重:

bool check(){
    long long res1 = 0, res2 = 0;
    queue<int> queTmp;
    while(!q1.empty()){
        int top = q1.front();
        q1.pop();
        queTmp.push(top);
        res1 = res1*10 + top;
    }
    while(!queTmp.empty()){
        int top = queTmp.front();
        queTmp.pop();
        q1.push(top);
    }
    while(!q2.empty()){
        int top = q2.front();
        q2.pop();
        queTmp.push(top);
        res2 = res2*10 + top;
    }
    while(!queTmp.empty()){
        int top = queTmp.front();
        queTmp.pop();
        q2.push(top);
    }
    if(vis.count(make_pair(res1, res2))){
        return true;
    }
    else{
        vis[make_pair(res1, res2)] = true;
        return false;
    }
}

D.Soldier and Number Game

题解:这道题需要两次用到DP,另外筛法打表判断素数也是很重要,之前竟然一直都不知道,给上了一课。。

第一次DP:

DP求i的所有质因数个数:

i:0~MAX

if(i是一个素数)

dp[i]=1;

else

dp[i]=dp[i/x]+1;(x是一个较小的能被i整除的素数)

第二次DP:

i:0~MAX

DP求i的阶乘内所有质因数个数:

if(i是一个素数)

dp[i]=dp[i-1]+1

else

dp[i]=dp[i-1]+res[i];

筛法求素数:

void if_prime()
{
    memset(isPrime, true, sizeof(isPrime));
    isPrime[0] = false, isPrime[1] = true;
    res[1] = 0;
    for( int i = 2; i < MAX; i++ )
    {
        if( isPrime[i] ){
            res[i] = 1;
            for( int j = 2; j*i < MAX; j++ ){
                isPrime[j*i] = false;
            }
        }
    }
    return ;
}

代码实现:

#include <iostream>
#include <bits/stdc++.h>
#define MAX 5000010
#define LL long long

using namespace std;

bool isPrime[MAX];
int res[MAX];
int dp[MAX];
LL arr[MAX];
int judge(int x);
void if_prime();
int main()
{
    memset(arr,0,sizeof(arr));
    memset(res,0,sizeof(res));
    if_prime();
    for( int i = 2; i < MAX; i++ )
    {
        if( isPrime[i] )
            arr[i] = arr[i-1]+1;
        else
        {
            res[i] = judge(i);
            arr[i] = arr[i-1]+res[i];
        }
    }
    int T;
    scanf("%d",&T);
    while( T-- )
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%I64d\n",arr[a]-arr[b]);
    }
    return 0;
}

void if_prime()
{
    memset(isPrime, true, sizeof(isPrime));
    isPrime[0] = false, isPrime[1] = true;
    res[1] = 0;
    for( int i = 2; i < MAX; i++ )
    {
        if( isPrime[i] ){
            res[i] = 1;
            for( int j = 2; j*i < MAX; j++ ){
                isPrime[j*i] = false;
            }
        }
    }
    return ;
}

int judge(int x)
{
    int cnt = 0;
    for( int i = 2; i <= sqrt(x); i++ )
    {
        if( isPrime[i] && !isPrime[x] && x%i == 0 ){
            cnt = res[x/i]+1;
            break;
        }
    }
    return res[x] = cnt;
}
时间: 2024-11-08 23:54:20

CF#304Div2的相关文章

微信 {&quot;errcode&quot;:40029,&quot;errmsg&quot;:&quot;invalid code, hints: [ req_id: Cf.y.a0389s108 ]&quot;}

{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"} 问题:微信网页授权后,获取到 openid 了,一刷新又没了 微信网页授权获取到的 code 只能使用一次(5分钟内有效),使用一次后,马上失效. 页面授权跳转成功,根据 code 也换取到 openid 了. 此时刷新页面,并不会再次进行授权,而是直接刷新了一下上一次授权跳转后的链接,带的还是

CF with friends and user&#39;s influence considered on NYC data(updated Aug,11st)

Here is the code link: https://github.com/FassyGit/LightFM_liu/blob/master/U_F1.py I use NYC data as other experimens. The split of the training data was seperated by the timeline, and I have normalised the interaction matrix by replacing the checkin

CF 750

今天CF打的块残废了     就是一废物 A 在24点之前到 直接模拟即可 #include<stdio.h> #include<algorithm> #include<cstring> #include<string> #include<cmath> using namespace std; #define LL long long #define MAXN 1010 #define inf 1000000000.0 int main() {

CF #394 (2) 5/6

Codeforces Round #394 (Div. 2) 总结:有毒的一场比赛.做了三题,结果A被叉,B.C挂综测,还hack失败一发,第一次在CF体会到了-50分的感觉..不知道是不是人品好,比赛时room炸了,然后,unrated.. A  水题,判一下0 0,然后abs(a-b)<=1 B  水题,组个间距比较一下,但一个数的时候要判一下 C  直接暴力上的题 D  也是xjb暴力 题意:给出n,l,r, a[], p[],另有两个数组b[], c[],ci=bi-ai.l<=ai,

一场CF的台前幕后(上)——转

前奏 大约4月份的时候,业界毒瘤pyx噔噔噔跑过来说:“酷爱!我YY了一道题!准备当CF的C” 我当时就被吓傻了."Yet another Chinese round?" “区间取模,区间求和” 感觉这题还不错?不过pyx嫌水了…… 好办!当时我刚刚出完动态仙人掌不久,于是一拍脑袋说:把这个问题出到仙人掌上去! 当然被pyx鄙视了…… 后来一直就没啥动静,直到5月底的CTSC. 试机的时候pyx给我看了套他出的神题……里面有一道题……我不小心读成了下面这个样子: “给定n个m维的模2意

[2016-03-22][CF][69A][Young Physicist]

时间:2016-03-22 19:41:34 星期二 题目编号:[2016-03-22][CF][69A][Young Physicist] 题目大意:判断向量和是否为0 分析:对应坐标相加 遇到的问题:不能用x+y+z来判断是否都为0,除非输入都是正数 #include <cstdio> using namespace std; int main(){ int a,b,c,x,y,z,n; x = y = z = 0; scanf("%d",&n); for(in

ARC下OC对象和CF对象之间的桥接(bridge)

在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环境下编译器不会自动管理CF对象的内存,所以当我们创建了一个CF对象以后就需要我们使用CFRelease将其手动释放,那么CF和OC相互转化的时候该如何管理内存呢?答案就是我们在需要时可以使用__bridge,__bridge_transfer,__bridge_retained,具体介绍和用法如下

【CF 520D】Cubes

[CF 520D]Cubes 怎么说呢--英语阅读题+超级大模拟-- 最重要的是知道怎么出来的数据...题意好懂 xy坐标内给出几个单位正方形 以正方形左下点坐标给出 y=0为地面 正方形下面或者左右下方至少存在一个正方形他才能稳定.. 正方形按0~m-1标号 每次只能取出不影响整体结构的正方形 甲乙玩一个游戏 交替取正方形 每取下一个按从左到右的顺序排好 得到一个大数 重点来了! 取出的数是m进制 转换为十进制是最终结果 甲希望结果最大 乙希望结果最小 问结果为多少 甲先取 题意明白了模拟就行

cf 148D Bag of mice

The dragon 选一只老鼠,然后会跑掉一只 the princess选一只老鼠,不会跑出另外的老鼠 求the princess赢的概率 1 #include<iostream> 2 #include<string> 3 #include<cstdio> 4 #include<vector> 5 #include<queue> 6 #include<stack> 7 #include<algorithm> 8 #inc