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;
}