2020大一寒假培训三 (暴力)

比例简化
Problem:J
Time Limit:1000ms
Memory Limit:65535K
Description
在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某观点表示支持的有 1498 人,反对的有 902 人,那么其比例可以简单地记为1498∶902。
因该比例的数值太大,难以一眼看出它们的关系。若把比例记为 5∶3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。
现给出支持人数 A 和反对人数 B,以及一个上限 L,请将 A 比 B 化简为 A′ 比 B′,要求在 A′和 B′ 均不大于 L,且 A′ 和 B′ 互质(两个整数的最大公约数为 1)的前提下,A′/B′≥ A/B 且 A′/B′-A/B 的值尽可能小。
Input
一行三个整数 A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。
Output
一行两个整数 A′ 和 B′,中间用一个空格隔开,表示化简后的比例。
Sample Input
1498 902 10
Sample Output
5 3
Hint
单组输入,1<=A,B<=1000000,1<=L<=100,A/B<=L

c++自带gcd函数,直接用即可
辗转相除法
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}

int gcd(int x,int y)
{
return y?gcd(y,x%y):x;
}

#include <bits/stdc++.h>

using namespace std;
int gcd(int a,int b)
{
    if(b==0)
    {
        return a;
    }
    else
    {
        return gcd(b,a%b);
    }
}
int main()
{
    int a,b,L;
    double k1,k2,k3,A,B;
    k3=9999999;
    cin>>A>>B>>L;
    k1=A/B;//A和B都要是double,不然无法与K1计算,在这卡了半天,痛苦面具

    for(double i=1;i<=L;i++)
    {
        for(double j=1;j<=L;j++)
        {
           if(gcd(i,j)==1)
           {
            k2=i/j;
            if(k2>=k1&&k2-k1<k3)
             {
                 a=i;b=j;
                 k3=k2-k1;
             }

           }
         }
      }
       cout<<a<<" "<<b<<endl;

    return 0;
}

K 奶牛碑文
Problem:K
Time Limit:1000ms
Memory Limit:65535K
Description
小伟暑假期间到大草原旅游,在一块石头上发现了一些有趣的碑文。碑文似乎是一个神秘古老的语言,只包括三个大写字母 C、O 和 W。尽管小伟看不懂,但是令他高兴的是,C、O、W的顺序形式构成了一句他最喜欢的奶牛单词“COW”。现在,他想知道有多少次 COW 出现在文本中。
如果 COW 内穿插了其他字符,只要 COW 字符出现在正确的顺序,小伟也不介意。甚至,他也不介意出现不同的 COW 共享一些字母。例如,CWOW 出现了 1 次 COW,CCOW 算出现了2 次 COW,CCOOWW 算出现了 8 次 COW。
Input
第 1 行为 1 个整数 N。
第 2 行为 N 个字符的字符串,每个字符是一个 C、O 或 W。
Output
输出 COW 作为输入字符串的字串出现的次数(不一定是连续的)。
提示:答案会很大,建议用 64 位整数(long long)。
Sample Input
6
COOWWW
Sample Output
6
Hint
对于 50% 的数据满足:N≤60。
对于 100% 的数据满足:N≤100000。
单组输入

#include <bits/stdc++.h>

using namespace std;
string stu;
int main()
{
    long long c=0,co=0,cow=0,N;

    while(cin>>N)
    {
       cin>>stu;//**直接输入整个字符串,用for一个一个进入会超时**
        for(int i=0;i<N;i++)
        {
            if(stu[i]=='C') c++;
            if(stu[i]=='O') co=co+c;
            if(stu[i]=='W') cow=cow+co;
        }
            cout<<cow<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值