EODVT 发表于 2023-1-30 09:12:00

USACO2023.1铜级的第一道问题

题目如下:
农夫John有N头奶牛(2≤N≤105)。每头牛都有一个品种,不是根西岛就是荷斯坦岛。通常情况下,牛站成一排,按顺序从1到N编号。
在一天的过程中,每头奶牛都写下一份奶牛名单。具体来说,奶牛i的列表包含了从她自己(奶牛i)开始到并包括奶牛Ei (i≤Ei≤N)的奶牛的范围。
FJ最近发现每个品种的牛都有一个不同的领导者。FJ不知道领导者是谁,但他知道每个领导者必须有一个列表,包括他们品种的所有奶牛,或其他品种的领导者(或两者都有)。
帮助FJ计算可以成为领导者的奶牛对数。它保证至少有一个可能的对。
输入格式(输入从终端/ stdin到达):
第一行包含N。
第二行包含一个长度为N的字符串,第i个字符表示第i头奶牛的品种(G表示根西岛,H表示荷斯坦)。可以保证至少有一个根西岛和一个荷尔斯泰因岛。
第三行包含E1…EN。
输出格式(打印输出到终端/ stdout):
输出可能的领导对的数目。
样例输入:
4
GHHG
2 4 3 4
样例输出:
1
唯一有效的领导者对(1,2)。牛1的列表包含了其他品种的领导者(牛2)。牛2的列表包含了她的品种(荷斯坦)的所有奶牛。
没有其他对是有效的。例如,(2,4)无效,因为奶牛4的列表不包含其他品种的领导者,也不包含该品种的所有奶牛。
样例输入:
3
GGH
2 3 3
样例输出:
2
有两个有效的领导者对(1,3)和(2,3)。
得分

输入3 ~ 5:N≤100

输入6 ~ 10:N≤3000

输入11-17:无附加约束。
请会给个解法,谢谢。

学习编程的采集 发表于 2023-1-30 10:54:18

EODVT 发表于 2023-1-30 11:30:36

你要发直发

学习编程的采集 发表于 2023-1-30 14:29:14

EODVT 发表于 2023-1-30 14:41:00

考完了

EODVT 发表于 2023-1-30 14:41:30

就这道不会

EODVT 发表于 2023-1-30 14:50:17

所以才来问问

EODVT 发表于 2023-1-30 16:25:52

学习编程的采集 发表于 2023-1-30 14:29
你很可疑?你是不是还没考呢?

考完了,就这道不会,
所以才来问问

ExiaGN001 发表于 2023-2-2 08:35:12

https://fishc.com.cn/thread-223972-1-1.html

sfqxx 发表于 2023-2-26 19:59:14

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+10;
int n,k;
char s;
int e,is,ans;
int cnt,a;//记录字符串情况
int main(){
      scanf("%d",&n);                                                               
      scanf("%s",s+1);
      for(int i=1;i<=n;i++)scanf("%d",&e);                                        //b
      for(int i=1;i<=n;i++){
                //printf("%c ",s);
                if(s=='G')cnt++;
                else cnt++;
      }
      //for(int i=1;i<=n;i++)printf("cnt = %d %d\n",cnt,cnt);
      for(int i=1;i<=n;i++){
                a=a+cnt;
                a=a+cnt;
      }
      //for(int i=1;i<=n;i++)printf("a = %d %d\n",a,a);
      for(int i=1;i<=n;i++){
                int l=0;
                if(s=='H')l=1;
                if(a]-a==a)is=1;
      }
      //for(int i=1;i<=n;i++)printf("is = %d\n",is);
      for(int i=1;i<=n;i++)ans=ans+is;
      //for(int i=1;i<=n;i++)printf("ans = %d\n",ans);
      for(int i=1;i<=n;i++)k=k+ans]-ans;
      k=k+ans*(ans-1)/2;
      printf("%d\n",k);
      return 0;
}
如果答案对您有帮助,请设置最佳答案!
页: [1]
查看完整版本: USACO2023.1铜级的第一道问题