Educational Codeforces Round 1

本文解析了五道编程竞赛题目,包括求特定条件下的数列和、字符串操作、寻找最近向量、博物馆路径搜索及巧克力切割成本最小化的动态规划算法。

被C坑的不行不行的。。。其他题目都还可以。

A - Tricky Sum

求1,2,3,...,n的加和,其中2^x(x>=0)为负。

因为2^x的个数很少,所以以每个2^x为分界点进行判断.

初始化x=0;

如果n>2^x,求出2^(x-1)到2^(x)之间的加和,用等差数列求和公式即可,然后x++,

如果n<=2^x,求出2^(x-1)到n之间的加和,然后结束.

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;



int main(int argc, const char * argv[]) {
    // insert code here...
    int T;
    scanf("%d",&T);
    while (T--) {
        int n;
        scanf( "%d",&n);
        long long tmp=1;
        long long sum=0;
        while(tmp<=n)
        {
            if( tmp-1 >= tmp/2+1 )
            {
                sum += (tmp+tmp/2)*(tmp-tmp/2-1)/2;
            }
            sum -= tmp;
            tmp*=2;
        }
        sum += (tmp/2+1+n)*(n-tmp/2)/2;
        cout<<sum<<endl;
    }
    return 0;
}
A

(感触:以后写等差数列求和时写个函数,方便些)

B - Queries on a String

看懂题目,模拟即可。

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;


char str[2][10100];

int main(int argc, const char * argv[]) {
    // insert code here...
    scanf("%s",str[0]);
    int m;
    scanf("%d",&m);
    int a=0,b=1;
    for (int i=0;i<m; i++) {
        int l,r,k;
        scanf("%d%d%d",&l,&r,&k);
        l--;
        r--;
        int tlen=(r-l+1);
        k%=tlen;
        strcpy(str[b],str[a]);
        for(int j=l;j<=r;j++)
        {
            str[b][l+ (j-l+k)%tlen ]=str[a][j];
        }
        swap(a,b);
        //printf("%s\n",str[a]);
    }
    printf("%s\n",str[a]);
    return 0;
}
B

C - Nearest vectors

这题可以看这里,里面有我写这题的崎岖之路。

D - Igor In the Museum

很裸的BFS。 不同的是,到一个格点,搜索一下周围四个方向上墙的个数。

#include <iostream>
#include <stdio.h>
#include <string>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;

int n,m,k;
char g[1010][1010];
int mark[1010][1010];
int id;

struct node
{
    int x,y;
}que[1001000];

int qf,qd;
int save[1001000];
int up[4]={1,-1,0,0};
int rl[4]={0,0,1,-1};

void bfs(int x,int y)
{
    qf=qd=0;
    node fi;
    fi.x=x;
    fi.y=y;
    int cnt=0;
    que[qf++]=fi;
    mark[x][y]=id;
    while(qf>qd)
    {
        node cur=que[qd++];
        for(int i=0;i<4;i++)
        {
            int tx=cur.x+up[i];
            int ty=cur.y+rl[i];
            if( tx>=0&&tx<n &&ty>=0&&ty<m )
            {
                if(g[tx][ty]=='.'&&mark[tx][ty]==-1 )
                {
                    mark[tx][ty]=id;
                    node newnode;
                    newnode.x=tx;
                    newnode.y=ty;
                    que[qf++]=newnode;
                }
                else if(g[tx][ty]=='*') cnt++;
            }
        }
    }
    save[id]=cnt;
    id++;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<n;i++)
        scanf("%s",g[i]);
    id=0;
    memset(mark,-1,sizeof(mark));
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if( mark[i][j] ==-1 && g[i][j] == '.' )
            {
                bfs(i,j);
            }
        }
    for(int i=0;i<k;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        x--;y--;
        printf("%d\n",save[ mark[x][y] ]);
    }
    return 0;
}
D

E - Chocolate Bar

DP.

状态:

dp[i][j][k] 表示高为i,宽为j的巧克力被分成能拼成k的最小花费。

转移:

考虑每一种横着切和竖着切的情况。具体看代码。

 

#include <iostream>
#include <stdio.h>
#include <string>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define INF 100000000
int dp[33][33][55];

int main(int argc, const char * argv[]) {
    dp[1][1][1]=0;
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=30;i++)
        for(int j=1;j<=30;j++)
            for(int k=1;k<=50;k++)
                dp[i][j][k]=INF;
    dp[1][1][1]=0;
    for(int i=1;i<=30;i++)
        for(int j=1;j<=30;j++)
        {
            if(i==j&&i==1) continue;
            
            for(int k=1;k<=min(i*j,50);k++)
            {
                if(i*j==k)
                {
                    dp[i][j][k]=0;
                    continue;
                }
                int mi=INF;
                for(int i1=1;i1<i;i1++)
                {
                    if( i1*j <= k) mi=min(mi,dp[(i-i1)][j][k-i1*j]+j*j);
                    if( (i-i1)*j <= k ) mi=min(mi,dp[i1][j][k-(i-i1)*j]+j*j);
                    if( i1*j >= k) mi=min(mi,dp[i1][j][k]+j*j);
                    if( (i-i1)*j >=k ) mi=min(mi,dp[i-i1][j][k]+j*j);
                }
                for(int j1=1;j1<j;j1++)
                {
                    if( j1*i <= k ) mi=min(mi,dp[i][j-j1][k-j1*i]+i*i);
                    if( (j-j1)*i <=k ) mi=min(mi,dp[i][j1][k-(j-j1)*i]+i*i);
                    if( j1*i >= k) mi=min(mi,dp[i][j1][k]+i*i);
                    if( (j-j1)*i >=k ) mi=min(mi,dp[i][j-j1][k]+i*i);
                }
                //有四种情况
                
                dp[i][j][k]=mi;
            }
            
        }
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        printf("%d\n",dp[x][y][z]);
    }
    return 0;
}
E

 

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值