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
来源:牛客网
题目描述
一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女座好强啊”。处女座经过调查发现群里的复读机都是失真的复读机,会固定的产生两个错误。一个错误可以是下面的形式之一:
-
将任意一个小写字母替换成另外一个小写字母
-
在任意位置添加一个小写字母
-
删除任意一个字母
处女座现在在群里发了一句话,他收到了一个回应,他想知道这是不是一个复读机。
输入描述:
两行
第一行是处女座说的话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");
}