Codeforces 200 div.2

C.Rational Resistance

题意:给出一个分数,分子为a,分母为b,求组成该电阻的最小个数。电阻有串联并联两种方式,初始电阻均为1.

思路:因为串联越多,电阻增大;并联越多,电阻减小。

// [a/b]表示int(a/b),a/b表示为分数b分之a;

例如a=21,b=8;那么其一定是由[21/8]个电阻再加上21/8-2=5/8,即使8/5的倒数,那么8/5又是由[8/5]加上3/5。

同理5/3=[5/3]+2/3;3/2=[3/2]+1/2;2/1=2;

所以21/8=[21/8]+[8/5]+[5/3]+[3/2]+[2/1]=2+1+1+1+2=7;

注意数据的范围

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
  ll a,b,ans;
  ans=0;
  cin>>a>>b;
  if(a<b)swap(a,b);
  while(a&&b)
  {
    if(a<b)swap(a,b);
    ans+=a/b;
    a-=a/b*b;
  }
  cout<<ans<<endl;
}

D.Alternating Current

题意:两根“+”,“-”的电线,给你一个只含有“+”“-”的字符串,“+”表示+的电线压在-的上面,反之。

问给出的电线交叉方式能否互不缠绕,能输出Yes,不能输出No。

思路:两个相邻且相同的字符可以把两根线分开。例如-++-,不断的理清相邻且相同的字符,-++- ->  --。所以可以利用栈先进后出的特点,遍历字符串,与栈头不同则加入栈,反之则pop。

#include<bits/stdc++.h>
using namespace std;
char str[100005];
int main(){
  while(~scanf("%s",str)){
    stack<char>q;
    int n=strlen(str);
    for(int i=0;i<n;i++){
      if(q.empty()||str[i]!=q.top())q.push(str[i]);
      else{
        q.pop();
      }
    }
    if(q.empty())printf("Yes\n");
    else printf("No\n");
  }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值