2017 Fzu校赛 [Cloned]

Posted Soda

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017 Fzu校赛 [Cloned]相关的知识,希望对你有一定的参考价值。

A - Salty Fish

海边躺着一排咸鱼,一些有梦想的咸鱼成功翻身(然而没有什么卵用),一些则是继续当咸鱼。一个善良的渔夫想要帮这些咸鱼翻身,但是渔夫比较懒,所以只会从某只咸鱼开始,往一个方向,一只只咸鱼翻过去,翻转若干只后就转身离去,深藏功与名。更准确地说,渔夫会选择一个区间[L,R],改变区间内所有咸鱼的状态,至少翻转一只咸鱼。

渔夫离开后想知道如果他采取最优策略,最多有多少只咸鱼成功翻身,但是咸鱼大概有十万条,所以这个问题就交给你了!

Input

 

包含多组测试数据。

每组测试数据的第一行为正整数n,表示咸鱼的数量。

第二行为长n的01串,0表示没有翻身,1表示成功翻身。

 

n≤100000

Output

在渔夫的操作后,成功翻身咸鱼(即1)的最大数量。

Sample Input
5
1 0 0 1 0
3
0 1 0
Sample Output
4
2
Hint

对于第一个样例,翻转区间[2,3],序列变为1 1 1 1 0。

对于第二个样例,翻转整个区间,序列变为1 0 1。

技术分享
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 100010
int sum,n,a[maxn];
int main(){
    while(scanf("%d",&n)!=EOF){
        sum=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        if(sum==n){
            printf("%d\n",n-1);
            continue;
        }
        int now=0,mx=0;
        for(int i=1;i<=n;i++){
            if(a[i]==1){
                now--;
                if(now<0)now=0;
            }
            if(a[i]==0){
                now++;
                mx=max(mx,now);
            }
        }
        printf("%d\n",mx+sum);
    }
}
AC代码

 

 

F - 奖励

福州大学某班共有n名学生,这些学生这学期都选修了3门课,分别是大物、高数、大英。YellowStar想对这学期总绩点不低于3.0的学生进行奖励,所以他将每名学生每门课程的分数告诉你,并希望你能告诉他他必须对多少名学生进行奖励。

对于单门课程的绩点计算方法是(分数/10-5),如分数是69,那么绩点就是1.9,学生的总绩点就是他每门课程的绩点的平均值。但是要注意的是,当某门课程的分数小于60时,就会被视为挂科,总绩点直接为0。

Input

包含多组测试数据。

第一行输入一个整数n,表示一共有n名学生。

接下来输入n行,每行3个整数,分别表示当前学生的3门课程的分数,分数都不大于100且不小于0。

n≤500000

Output

输出一个整数,表示有多少人的总绩点不低于3.0。

Sample Input

3
59 50 92
60 80 97
83 94 67

Sample Output

1

Hint第一名同学有低于60分的科目,所以总绩点为0。 第二名同学的总绩点为(1+3+4.7)/3=2.9 第三名同学的总绩点为(3.3+4.4+1.7)/3约为3.13 只有最后一名同学的总绩点超过3.0

技术分享
/*
    比较坑的一道题,骗我交了三遍
    对精度要求非一般的高。。。。就是只要你用double算就肯定错
    A的方法是不等式移项判断
*/
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int main(){
    while(scanf("%d",&n)!=EOF){
        int a,b,c,ans=0;
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&a,&b,&c);
            if(a>=60&&b>=60&&c>=60&&(a+b+c)>=240)ans++;
        }
        printf("%d\n",ans);
    }
}
AC代码

 

 

I - 浪里个浪

TonyY是一个喜欢到处浪的男人,他的梦想是带着兰兰姐姐浪遍天朝的各个角落,不过在此之前,他需要做好规划。

现在他的手上有一份天朝地图,上面有n个城市,m条交通路径,每条交通路径都是单行道。他已经预先规划好了一些点作为旅游的起点和终点,他想选择其中一个起点和一个终点,并找出从起点到终点的一条路线亲身体验浪的过程。但是他时间有限,所以想选择耗时最小的,你能告诉他最小的耗时是多少吗?

Input

 

包含多组测试数据。

输入第一行包括两个整数n和m,表示有n个地点,m条可行路径。点的编号为1 - n。

接下来m行每行包括三个整数i, j, cost,表示从地点i到地点j需要耗时cost。

接下来一行第一个数为S,表示可能的起点数,之后S个数,表示可能的起点。

接下来一行第一个数为E,表示可能的终点数,之后E个数,表示可能的终点。

0<S, E≤n≤100000,0<m≤100000,0<cost≤100。

Output

输出他需要的最短耗时。

Sample Input

4 4
1 3 1
1 4 2
2 3 3
2 4 4
2 1 2
2 3 4

Sample Output

1
技术分享
/*
    一次spfa即可 
    初始化时把所有可能的起点dis=0 
    然后入队 
    然后跑spfa 
    跑完枚举哪个终点dis最小 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 100010
int dis[maxn],n,m,num,head[maxn];
bool vis[maxn];
struct node{
    int to,pre,v;
}e[maxn];
void Insert(int from,int to,int v){
    e[++num].to=to;
    e[num].v=v;
    e[num].pre=head[from];
    head[from]=num;
}
queue<int>q;
void spfa(){
    while(!q.empty()){
        int now=q.front();q.pop();vis[now]=0;
        for(int i=head[now];i;i=e[i].pre){
            int to=e[i].to;
            if(dis[to]>dis[now]+e[i].v){
                dis[to]=dis[now]+e[i].v;
                if(!vis[to]){
                    vis[to]=1;
                    q.push(to);
                }
            }
        }
    }
}
int main(){
    freopen("Cola.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF){
        memset(dis,127/3,sizeof(dis));
        memset(head,0,sizeof(head));
        memset(e,0,sizeof(e));num=0;
        while(!q.empty())q.pop();
        int x,y,z;
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&z);
            Insert(x,y,z);
        }
        int S,T;
        scanf("%d",&S);
        
        for(int i=1;i<=S;i++){
            scanf("%d",&x);
            dis[x]=0;
            vis[x]=1;
            q.push(x);
        }
        spfa();
        scanf("%d",&T);
        int ans=0x7fffffff;
        for(int i=1;i<=T;i++){
            scanf("%d",&x);
            ans=min(ans,dis[x]);
        }
        printf("%d\n",ans);
    }
}
AC代码

 

以上是关于2017 Fzu校赛 [Cloned]的主要内容,如果未能解决你的问题,请参考以下文章

FZU 2088 最长队名

2017福建省赛 FZU2272~2283

河南工业大学2017校赛题解

2017CUIT校赛-线上赛

2017 多校赛 第二场

2017 校赛 问题 E: 神奇的序列