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代码