1. 程式人生 > >2017 Fzu校賽 [Cloned]

2017 Fzu校賽 [Cloned]

sample fzu 輸入一個整數 就會 必須 分數 體驗 head 輸入

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]