牛客寒假算法基础集训营2 D,G,J

D 处女座与重修费
链接:https://ac.nowcoder.com/acm/contest/327/D
来源:牛客网

题目描述
期末考试结束了,处女座发现很多人挂了大物,只能等着第二年重修,还要交400元的重修费。处女座突然想起有个学长和他讲过,如果学校哪一年缺钱了,那一年的大物试卷就会特别难。现在处女座有了所有人的成绩,处女座想知道如果所有挂科的人都在第二年重修,学校能赚多少重修费?

挂科是指一门课的分数小于60分。
输入描述:

第一行一个整数n,表示考试的人数。
第二行n个整数,表示每个人的成绩。
1<=n<=10000
学生的成绩为0-100(包括0和100)之间的整数

输出描述:

一行,学校能赚的重修费用

示例1
输入

4
60
56
100
59

输出

800
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,count,flag;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>flag;
		if(flag<60){
			count++;
		}
	}
	cout<<count*400<<endl;
} 

G 处女座与复读机
链接:https://ac.nowcoder.com/acm/contest/327/G
来源:牛客网

题目描述
一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女座好强啊”。处女座经过调查发现群里的复读机都是失真的复读机,会固定的产生两个错误。一个错误可以是下面的形式之一:

  1.   将任意一个小写字母替换成另外一个小写字母
    
  2.   在任意位置添加一个小写字母
    
  3.   删除任意一个字母
    

处女座现在在群里发了一句话,他收到了一个回应,他想知道这是不是一个复读机。

输入描述:

两行
第一行是处女座说的话s
第二行是收到的回应t
s和t只由小写字母构成且长度小于100

输出描述:

如果这可能是一个复读机输出”YES”,否则输出”NO”

示例1
输入

abc
abcde

输出

YES

说明

abc->abcd->abcde

示例2
输入

abcde
abcde

输出

YES

说明

abcde->abcdd->abcde

备注:

只要能经过两步变换就从s得到t就有可能是复读机

dp解法,copy的大佬提交的代码

#include<bits/stdc++.h>
using namespace std;
const int INF=1e9;
const int maxn=105;
int dp[maxn][maxn];
char s[maxn],t[maxn];
int main(){
    scanf("%s %s",s+1,t+1);
    int len1=strlen(s+1),len2=strlen(t+1);
    for(int i=1;i<=len1;i++){
        for(int j=1;j<=len2;j++) dp[i][j]=INF;
    }
    for(int i=1;i<=len1;i++) dp[i][0]=i;
    for(int j=1;j<=len2;j++) dp[0][j]=j;
    for(int i=1;i<=len1;i++){
        for(int j=1;j<=len2;j++){
            int flag=1;
            if(s[i]==t[j])  flag=0;
            dp[i][j]=min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+flag));
        }
    }
    if(dp[len1][len2]<=2)    printf("YES\n");
    else    printf("NO\n");
}

深搜解法

#include<bits/stdc++.h> 
using namespace std;
int lena,lenb;
char a[105],b[105];
bool ans=false;
void dfs(int posa,int posb,int t){
    if(t>2)return;
    if(posa==lena&&posb==lenb){
        ans=true;
    }
    if(ans)return;
    if(posa>lena||posb>lenb)return;
    if(a[posa]==b[posb]){
        dfs(posa+1,posb+1,t);
    }else{
        dfs(posa+1,posb,t+1);
        dfs(posa,posb+1,t+1);
        dfs(posa+1,posb+1,t+1);
    }
}
int main(){
    scanf("%s",a);
    scanf("%s",b);
    lena=strlen(a);
    lenb=strlen(b);
    dfs(0,0,0);
    if(ans){
        printf("YES\n");
    }else printf("NO\n");
}

J 处女座的期末复习
链接:https://ac.nowcoder.com/acm/contest/327/J
来源:牛客网

题目描述
快要期末考试了,处女座现在有n门课程需要考试,每一门课程需要花ai小时进行复习,考试的起始时间为bi,处女座为了考试可以不吃饭不睡觉,处女座想知道他能否复习完所有的科目(即在每一门考试之前复习完该科目)。每一门课的考试时间都为两小时。

输入描述:

第一行一个整数n
第二行n个整数a1,a2,…,an,表示每门课需要复习的时间
第三行n个整数b1,b2,…,bn,表示每门课考试的时间
1<=n<=105
0<=ai<=109
0<=bi<=109

输出描述:

如果处女座能复习完,输出”YES”,否则输出”NO”

示例1
输入

3
0 1 1
2 6 4

输出

YES

说明

在0-1小时复习第2门课,
在1-2小时复习第3门课,
在2-4小时考第1门课,
在4-6小时考第3门课,
在6-8小时考第2门课

备注:

考试时不能复习,保证考试时间不会重叠。

复习可以拆开,只要复习时间够了即可。

贪心,排一下序,然后模拟,一旦时间不够用,就no

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
	
};
bool cmp(node a,node b){
	return a.y<b.y;
}
int main(){
	int n;
	cin>>n;
	node a[100010];
	for(int i=0;i<n;i++){
		cin>>a[i].x;
	}
	for(int i=0;i<n;i++){
		cin>>a[i].y;
	}
	sort(a,a+n,cmp);
	int time;
	time=a[0].y;
	time-=a[0].x;
	int flag=1;
	int xia=a[0].y+2;
	if(time>=0){
		for(int i=1;i<n;i++){
			time+=a[i].y-xia;
			time-=a[i].x;
			xia=a[i].y+2;
			if(time<0){
				flag=0;
				break;
			}
		
		}
	}
	else{
		flag=0;
	}
	if(flag) printf("YES\n");
	else printf("NO\n");
} 

猜你喜欢

转载自blog.csdn.net/qq_37774171/article/details/86631451