2017 Fzu校賽 [Cloned]
A - Salty Fish
海邊躺著一排鹹魚,一些有夢想的鹹魚成功翻身(然而沒有什麽卵用),一些則是繼續當鹹魚。一個善良的漁夫想要幫這些鹹魚翻身,但是漁夫比較懶,所以只會從某只鹹魚開始,往一個方向,一只只鹹魚翻過去,翻轉若幹只後就轉身離去,深藏功與名。更準確地說,漁夫會選擇一個區間[L,R],改變區間內所有鹹魚的狀態,至少翻轉一只鹹魚。
漁夫離開後想知道如果他采取最優策略,最多有多少只鹹魚成功翻身,但是鹹魚大概有十萬條,所以這個問題就交給你了!
Input
包含多組測試數據。
每組測試數據的第一行為正整數n,表示鹹魚的數量。
第二行為長n的01串,0表示沒有翻身,1表示成功翻身。
n≤100000
Output在漁夫的操作後,成功翻身鹹魚(即1)的最大數量。
Sample Input5 1 0 0 1 0 3 0 1 0Sample Output
4 2Hint
對於第一個樣例,翻轉區間[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(){AC代碼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); } }
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]