6.24------Codeforces Round #491 (Div. 2)

A:就是这种情况可不可能。容易错的是,去了A的人数和去了B的人数都要大于等于既去了A又去了B的。

B:就是至少要重修几门。重修后分数为5.暴力解决

C:只要看出这个是单调的就好了,二分出答案

#include<stdio.h>
#define LL long long
LL n;
LL Jud(LL x)
{
	LL now, sum;
	now = n, sum = 0;
	while(now)
	{
		if(now<=x)
		{
			sum += now;
			break;
		}
		now -= x;
		sum += x;
		now -= now/10;
	}
	return sum;
}
int main(void)
{
	LL l, r, m;
	scanf("%I64d", &n);
	l = 1, r = n;
	while(l<r)
	{
		m = (l+r)/2;
		if(Jud(m)>=(n+1)/2)
			r = m;
		else
			l = m+1;
	}
	printf("%I64d\n", l);
	return 0;
}

D:这个题的坑点就在于,你如果要从左开始排,那么就要先考虑左边上下的两个再考虑右边的,这样“贪心”才是正确的。不能先排右边的,因为我是从左到右,就像玩俄罗斯方块一样。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s,t;
    int c[2][110];
    cin>>s>>t;
    int num=s.length();
    for(int i=0;i<num;i++)
    {
        if(s[i]=='X')
            c[0][i]=1;
        else
            c[0][i]=0;
    }
    for(int i=0;i<num;i++)
    {
        if(t[i]=='X')
            c[1][i]=1;
        else
            c[1][i]=0;
    }

   
    int ans=0;
    for(int i=1;i<num;i++)
    {
        if(c[0][i-1]==0&&c[1][i-1]==0&&c[0][i]==0)
        {
            ans++;
            c[0][i-1]=c[1][i-1]=c[0][i]=1;
        }
        if(c[0][i-1]==0&&c[1][i-1]==0&&c[1][i]==0)
        {
            ans++;
            c[0][i-1]=c[1][i-1]=c[1][i]=1;
        }
        if(c[0][i]==0&&c[1][i]==0&&c[0][i-1]==0)
        {
            ans++;
            c[0][i]=c[1][i]=c[0][i-1]=1;
        }
        if(c[0][i]==0&&c[1][i]==0&&c[1][i-1]==0)
        {
            ans++;
            c[0][i]=c[1][i]=c[1][i-1]=1;
        }
    }
    cout<<ans<<endl;
}

E:看了别人的代码还是不会写,思路就是很简单,就是枚举所有的组合情况,然后把以0开头的给删掉就行了。

待补。。。暂存下“别人家的代码”

#include<stdio.h>
#define LL long long
char str[1005];
LL ans, num[22], a[22], jc[22] = {1};
void Sech(int x)
{
	LL i, now, p, sum;
	if(x==10) //最多十个数  0--9
	{
		now = 1, sum = 0;   //计算组合数过程
		for(i=0;i<=9;i++)    
		{
			now = now*jc[a[i]];   //计算分母的重复元素
			sum += a[i];     //计算一共出现的次数
		}
		now = jc[sum]/NOw;  //利用公式算出组合数
		
		
		if(a[0]>=1)    //计算0在第一个位置的组合数
		{
			p = jc[a[0]-1];
			for(i=1;i<=9;i++)
				p = p*jc[a[i]];  //计算分母的重复元素
				
			now -= jc[sum-1]/p;  //全部组合数-0在开头的组合数
		}
		ans += now;
		return;
	}
	for(i=1;i<=num[x];i++)  //枚举x出现的次数
	{
		a[x] = i;           //给x赋值出现的次数
		Sech(x+1);            //继续dfs
	}
	if(num[x]==0)
		Sech(x+1);   //如果x没出现过,跳过
}
int main(void)
{
	LL i;
	scanf("%s", str+1);
	for(i=1;i<=19;i++)
		jc[i] = jc[i-1]*i;  //求解组合数最大19
	for(i=1;str[i]!=0;i++)
		num[str[i]-'0']++;   //预处理每个数字出现的次数
	Sech(0);                 //开始dfs
	printf("%I64d\n", ans);
	return 0;
}

总结一下这场比赛,除去时间太晚没打完就睡觉了这一客观条件,发现自己的读题能力近来又有些下降,我的小伙伴们读题都比我快,然后当我刚做完第二道题时,L大佬C,D都过了。发现自己的思维还是不行啊,赛后重新看了看,发现真的挺简单的。

比赛还是要多打才行,练手感和思维敏捷度。

这段时间简直要爆炸了。好方。


猜你喜欢

转载自blog.csdn.net/xianpingping/article/details/80794970