CF #303 div2

A:

乱搞就行了。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1

using namespace std;
const int maxn = 100 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);

int a[maxn][maxn];
bool vis[maxn];
int ans[maxn];

int main()
{
    #ifdef LOCAL
    freopen("in.txt", "r", stdin);
    #endif // LOCAL
    int n;
    scanf("%d", &n);
    memset(vis, true, sizeof(vis));
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (a[i][j] == 1)
            {
                vis[i] = false;
            }
            if (a[i][j] == 2)
            {
                vis[j] = false;
            }
            if (a[i][j] == 3)
            {
                vis[i] = false;
                vis[j] = false;
            }
        }
    }
    int cnt = 0;
    for (int i = 1; i <= n; i++)
    {
        if (vis[i])
            {
                ans[cnt++] = i;
            }
    }
    printf("%d\n", cnt);
    if (cnt)
    {
        printf("%d", ans[0]);
    for (int i = 1; i < cnt; i++)
    {
        printf(" %d", ans[i]);
    }
    }
    return 0;
}

B:

题意:

给两个串,其中只含有0和1,他们之间的距离定义为位置相同而数字不同的个数。

现在求与这两个串距离相等的一个串,若没有这样的串,输出impossible。

解析:

先统计不同个数,若为奇数那就肯定不可以啦。

然后是偶数的情况,用一个cnta和cntb来记录当前这个串的这个位与题目给的两个串的数。

详见代码。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1

using namespace std;
const int maxn = 100000 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);

char s[maxn];
char t[maxn];
char a[maxn];

int main()
{
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif // LOCAL
    scanf("%s", s);
    scanf("%s", t);
    int len = strlen(s);
    int cnt = 0;
    for (int i = 0; i < len; i++)
    {
        if (s[i] != t[i])
            cnt++;
    }
    if (cnt % 2)
    {
        printf("impossible\n");
    }
    else
    {
        bool flag = true;
        int cnta = 0, cntb = 0;
        for (int i = 0; i < len; i++)
        {
            if (t[i] == s[i])
            {
                a[i] = t[i];
            }
            else
            {
                if (cnta == cntb - 1)
                {
                    cnta++;
                    a[i] = t[i];
                }
                else if (cntb == cnta - 1)
                {
                    cntb++;
                    a[i]= s[i];
                }
                else
                {
                    a[i] = s[i];
                    cntb++;
                }
            }
            //cout << a << endl;
        }
//        cnta = 0, cntb = 0;
//        for (int i = 0; i < len; i++)
//        {
//            if (a[i] != t[i])
//                cnta++;
//            if (a[i] != s[i])
//                cntb++;
//        }
        if (cnta != cntb)
            printf("impossible\n");
        else
            printf("%s\n", a);
    }
    return 0;
}

C:

题意:

按照x轴升序给定一棵树的坐标x与高度h,现在可以砍掉这棵树让其左倒或者右倒,或者不砍。

砍倒的树不能覆盖到左树或者左树倒下的覆盖范围。

求最多可以砍倒多少棵树。

解析:

有两种方法做。

首先是dp,我用一个dp[maxn][3]的数组来表示当前的树的三种状态,不倒,左倒,右倒。

然后遍历一遍更新就行了。

错了两个地方,一个是左倒的几个判断,修改了一下;第二个是我n那棵树原来设定的x坐标是inf,inf无法达到2e9,所以在1e9 1e9这组数据wa了。


第二种方法是贪心,10行代码。。。


代码:

dp:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1

using namespace std;
const int maxn = 100000 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);

struct Tree
{
	int x, h;
} tree[maxn];

int dp[maxn][5];

int main()
{
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif // LOCAL
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
    	scanf("%d%d", &tree[i].x, &tree[i].h);
    }
    tree[n].x = 2000000010, tree[n].h = 2000000010;
    dp[0][0] = 1;//左倒
    dp[0][2] = 0;//不倒
    if (tree[0].x + tree[0].h < tree[1].x)
    	dp[0][1] = 1;//右倒
    else
    	dp[0][1] = 0;
    for (int i = 1; i < n; i++)
    {
    	//不倒
    	dp[i][2] = max(dp[i - 1][0], max(dp[i - 1][1], dp[i - 1][2]));
    	//右倒
    	if (tree[i].x + tree[i].h < tree[i + 1].x)
    	{
    		dp[i][1] = max(dp[i - 1][0], max(dp[i - 1][1], dp[i - 1][2])) + 1;
    	}
    	//左倒
    	if (tree[i].x - tree[i].h <= tree[i - 1].x)
    	{
    		dp[i][0] = dp[i][2];
    	}
    	else if (tree[i].x - tree[i].h <= tree[i - 1].x + tree[i - 1].h)
    	{
    		dp[i][0] = max(dp[i - 1][1], max(dp[i - 1][0] + 1, dp[i - 1][2] + 1));
    	}
    	else
    	{
    		dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][1], dp[i - 1][2])) + 1;
    	}
    }
    int ans = max(dp[n - 1][0], max(dp[n - 1][1], dp[n - 1][2]));
    printf("%d\n", ans);
    return 0;
}

贪心:

#include<stdio.h>
int a[100001],b[100001],n,i,j,s=2;
int main(){
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d%d",&a[i],&b[i]);
	for(i=1;i<n-1;i++){
		if(a[i]-a[i-1]>b[i])s++;
		else if(a[i+1]-a[i]>b[i]){s++;a[i]+=b[i];}
	}
	printf("%d",n==1?1:s);
}

D:

题意:

一群人来排队,每个人有一个满意的等待时间,你可以改变人的站位。

现在让你来换位,问能达到最多人满意是多少人。

解析:

贪心,从小到大排序,先满足时间短的人。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1

using namespace std;
const int maxn = 100000 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);

int a[maxn];

int main()
{
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif // LOCAL
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    sort(a, a + n);
    int ans = 0;
    int ti = 0;
    for (int i = 0; i < n; i++)
    {
        if (ti <= a[i])
        {
            ans++;
            ti += a[i];
        }
    }
    printf("%d\n", ans);
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值