1.10凉心的比赛(一)

A - 最小的二进制数

题意:

  给一个长度为n 只包含0、1的字符串。你可以有两种操作:

  1. 任意交换字符串中两个相邻的字符;
  2. 如果两个相邻的字符都是1,那么就可以用一个1 代替11 。比如  11 => 1;

  让你输出经过多次操作后 最小的正确字符串。

思路:

  如果字符串中有多个1,我们经过多次操作只留下一个 1 ,这样的字符串就是正确答案。

  所以统计字符串中 1 的个数,然后输出一个 1 ,接着把字符串中所有的0输出即可。

  当n=1 的时候特殊注意一下就可以了。

AC代码:

#include <iostream>
#include <cstring>
using namespace std;
int n,ans;
int main(){
    char s[110];
    cin>>n;
    for (int i=1; i<=n; i++) {
        cin>>s[i];
        if (s[i]=='1') ans++;
    }
    if (n==1) cout<<s[1]<<endl;
    else{
        cout<<'1';
        for (int i=1; i<=n-ans; i++) cout<<'0';
        cout<<endl;
    }
}

B - 线段的包含关系 

题意:

  给出 n个线段,问其中是不是有线段存在包含关系。输出被包含 和 包含 线段的位置(根据输入顺序确定的位置)。

思路:

  我们用结构体来存储线段的位置,以及左右端点。然后对其排序。 排序规则为:先将线段的左端点从小到大排序,

  如果左端点相等,那么就以右端点从大到小排序。排序结束后,我们遍历一边数组就可以得到答案啦。 

  因为线段左端点都是递增的,所以我们在比较包含关系的时候只需要比较右端点 存在包含关系就可以啦。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
const int maxn=3e5+100;
using namespace std;
struct node {
    int l,r,de;
};//存储线段的结构体
bool cmp(node a,node b){
    return a.l==b.l?a.r>b.r:a.l<b.l;
}//自定义排序方式函数,在sort里面使用
int n;
node a[maxn];
int main(){
    scanf("%d",&n);
    for (int i=1; i<=n; i++) {
        scanf("%d%d",&a[i].l,&a[i].r);
        a[i].de=i;
    }
    sort(a+1, a+1+n, cmp);
    for (int i=2; i<=n; i++) {
        if(a[i].r<=a[i-1].r){//后一个的右端点与前一个存在包含关系即线段存在包含关系
            printf("%d %d\n",a[i].de,a[i-1].de);
            return 0;
        }
    }
    printf("-1 -1\n");
}

C - 地下城还有劳拉

题意:

  给一个二维地图,规定行走路线,问走第n步时候的坐标点。 

思路:

  我们要注意他的走路方式,先走左一列,然后从左往右走最后一行,接着从右往左走倒数第二行,因为他保证一定是在(1,2)处结束。

  所以我们可以知道奇数行都是从右往左走,偶数行都是从左往右走。 所以特判走第一列,然后剩下走的行数模拟一下就行啦,这里要注意一下求余为0的情况。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
typedef long long ll;
using namespace std;
ll n,m,k;
int main(){
    cin>>n>>m>>k;
    if (k<=n-1) cout<<k+1<<' '<<1<<endl;//特判第一列
    else{  //蛇形走位模拟
        k-=(n-1); //k为走完行数剩余的步数
        ll l,r;  // l、r分别为最终坐标点(l,r)。
        if (k%(m-1)==0) l=n-k/(m-1)+1;
        else l=n-k/(m-1); //定位行数
        if (l%2)//定位列数
        {
            if (k%(m-1)) r=m-k%(m-1)+1;
            else r=2;
        }
        else {
            if (k%(m-1)) r=k%(m-1)+1;
            else r=m;
        }
        cout<<l<<" "<<r<<endl;
    }
}

D - 心火牧日常计算

代补


E - 法法在分配工作

题目:

  合理在n个人中分配出领导人,规定每个领导人都有相同的员工。

思路:

  签到题,暴力找一下就可以啦。

AC代码:

#include <iostream>
#include <cstdio>
using namespace std;
int n,ans;
int main(){
    cin>>n;
    for (int i=1; i<=n/2; i++) {
        if (n%i==0) ans++;
    }
    cout<<ans<<endl;
}

F - 法法要穿过大门

题意:

  在坐标系第一象限,每一个整数位坐标点都是一个城门,规定y=x 这条直线将第一象限划分为两个国家,每次从一个国家到另一个国家都要收费,

  给出fafa穿越城门的记录U为上行,R为右行,计算出fafa需要缴纳的费用。

思路:

  记录U,R的次数,每当U的次数超过R的次数,或者R的次数超过U的次数时 都要交钱--给钱给钱,快给钱。 

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n,ans;
int r,u;
string s;
int main(){
    cin>>n>>s;
    if (s[0]=='U') u++;
    else r++;
    for (int i=1; i<n; i++) {
        int t=0;
        if (r==u) t=1;
        if (s[i]=='R') r++;
        else u++;
        if (abs(r-u)==1&&s[i]==s[i-1]&&t==1) ans++; //过门,给钱,快给钱
    }
    cout<<ans<<endl;
}

G - 法法非法是朋友

滋滋滋


H - 法法和古代字母

嘶嘶嘶


I - 法法和古代数学

嘟嘟嘟


猜你喜欢

转载自www.cnblogs.com/yishuda/p/12177811.html