Codeforces Round #206 (Div. 2)

A:Vasya and Digital Root

思路:一个K位的数的每一位的和最大也就是K*9,遍历1~K*9,若有一个数满足dr(sum) = d,则说明K位的数中有满足条件的数,且和为sum,则任意一个和为sum的K位数都满足条件,任意输出一个即可。

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <cstdlib>
#include <algorithm>
using namespace std;
//typedef __int64 int64;
typedef long long ll;
#define M 100005
#define N 1000005
#define max_inf 0x7f7f7f7f
#define min_inf 0x80808080
#define mod 1000000007

int ans[1005];

int Cal(int k)
{
    int ret = k;
    while (ret >= 10)
    {
        while (k)
        {
            ret = 0;
            ret += k%10;
            k /= 10;
        }
        k = ret;
    }
    return ret;
}

int main()
{
    int k , d;
    scanf("%d%d",&k,&d);
    if (d == 0)
    {
        if (k == 1)printf("0\n");
        else printf("No solution\n");
        return 0;
    }
    int i , n = k*9;
    for (i = 1 ; i <= n ; i++)
    {
        int dr = Cal(i);
        if (dr == d)
        {
            while (dr > 9)printf("9"),dr-=9,k--;
            if (k > 0)printf("%d",dr),k--;
            int j;
            for (j = 0 ; j < k ; j++)printf("0");
            printf("\n");
            return 0;
        }
    }
    printf("No solution\n");
    return 0;
}


B:Vasya and Public Transport

思路:可能的结果为:买一张所有都能坐的票花c4,或者 bus和trolley分别去买,分别买就又分为(对bus来说)买一张能坐全部bus的票花c3,或者对于每一个bus单独买票,对一个bus单独买又分为买多张单程票和买一张能一直坐的票。对trolley分析是一样的,答案就是所有这些可能结果的最小值。


#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <cstdlib>
#include <algorithm>
using namespace std;
//typedef __int64 int64;
typedef long long ll;
#define M 100005
#define N 1000005
#define max_inf 0x7f7f7f7f
#define min_inf 0x80808080
#define mod 1000000007


int main()
{
    int c1,c2,c3,c4;
    int n,m;
    int a[1005],b[1005];
    scanf("%d%d%d%d",&c1,&c2,&c3,&c4);
    scanf("%d%d",&n,&m);
    int i , az = 0 , bz = 0;
    for (i = 0 ; i < n ; i++)
    {
        scanf("%d",a+i);
        if (a[i] != 0)az = 1;
    }
    for (i = 0 ; i < m ; i++)
    {
        scanf("%d",b+i);
        if (b[i]!=0)bz = 1;
    }
    int  ret1 = 0 , ret2 = 0;
    for (i = 0 ; i  < n ; i++)ret1 += min(a[i]*c1,c2);
    for (i = 0 ; i  < m ; i++)ret2 += min(b[i]*c1,c2);
    ret1 = min(ret1,c3);
    ret2 = min(ret2,c3);
    printf("%d\n",min(c4,ret1+ret2));
    return 0;
}

C: Vasya and Robot

思路:逆向抓取,若只有一个物品,机器人用左手和右手抓取分别为lsum和rsum,然后在这个物品的左右两边分别放一个物品,则对这两个物品抓取分别分为用左手或者用右手:

1.先最左边用左手抓,最右边也用左手,则所有的物品都必须用左手抓。

2.先最左边用左手抓,最右边用右手,则答案为w[z]*l+w[y]*r+min(lsum,rsum+qr)。z,y为最左和最右

3.先最右边用右手抓,最左边也用右手,则所有的物品都必须用右手手抓。

4.先最右边用右手抓,最左边用左手,则答案为w[y]*r+w[z]*l+min(lsum+ql,rsum)。

物品总个数为奇数初始为一个物品,为偶数初始为2个物品、

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <cstdlib>
#include <algorithm>
using namespace std;
//typedef __int64 int64;
typedef long long ll;
#define M 100005
#define N 1000005
#define max_inf 0x7f7f7f7f
#define min_inf 0x80808080
#define mod 1000000007

int n , l , r , ql , qr;
int w[M] , sum[M];

int main()
{
	int i;
	scanf("%d%d%d%d%d",&n,&l,&r,&ql,&qr);
	for (sum[0] = 0 , i = 1 ; i <= n ; i++)scanf("%d",w+i),sum[i]=sum[i-1]+w[i];
	int z , y , lsum = 0 , rsum = 0;
	if (n&1)
	{
		z = y = n/2+1;
		lsum = w[z]*l;
		rsum = w[y]*r;
	}
	else
	{
		z = n/2;
		y = n/2+1;
		lsum = min(w[z]*l+w[z+1]*l+ql,w[z]*l+w[z+1]*r);
		rsum = min(w[y]*r+w[y-1]*r+qr,w[y]*r+w[y-1]*l);
	}
	z--,y++;
	while (z >= 1)
	{
		int lt , rt;
		int temp = (sum[y]-sum[z-1]);
		lt = min(temp*l+ql*(y-z),w[z]*l+w[y]*r+min(lsum,rsum+qr));
		rt = min(temp*r+qr*(y-z),w[y]*r+w[z]*l+min(lsum+ql,rsum));
		lsum = lt;
		rsum = rt;
		z--,y++;
	}
	printf("%d\n",min(lsum,rsum));
	return 0;
}	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值