2019年2月18日训练日记

今天的题目也是很久之前的:

数假货进阶
[字符串操作]
题目大意:
给定字符串,任意位置最多添加n个字符‘j’,m个字符‘h’,求这个字符串最多包含多少个jh;
思路分析:
1输入数据
2转换规则:使用j/h的规则
[已有的jh] [成半的j/h] [没有使用完的j/h];
3输出数据:

代码实现:

int n,m,a,b,ans;
char ch[20005];
int main()
{
    while(~scanf(“%d%d”,&n,&m)  // n个 j,m个h
    {
        ans=a=b=0;		
        scanf(“%s”,ch);	//输入字符串
        for(int i=0;i<strlen(ch);i++)     //strlen()、<
        {
            if(i+1<strlen(ch)&&ch[i]=='j'&&ch[i+1]=='h')
            {			//现成假货jh
                ans++;
                i++;
            }
            else if(ch[i]==‘j’) a++; //单身的j/h各有多少捏?
            else if(ch[i]=='h') b++;
        }
 // what’s min(a,m) ?
        ans+=min(a,m)+min(b,n);
        //是否还有剩余的j/h没有使用?
        n-=b;
        m-=a;
        if(n>0&&m>0)       //有剩余的
        {
            ans+=min(n,m);	
		//what’s min()?
        }
        printf("%d\n",ans);
    }    
}

三连击
题目大意: 将1~9共九个数分成三组,分别组成三个三位数且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。
思路分析:
1确定数据范围
2求满足条件的数:
[九重循环?] [三重循环?][一重循环?]
3输出数据

代码实现:

int pan(int a,int b){     //what’s 函数
    int r[4],s[4];
    r[1]=a%10;  r[2]=(a/10)%10; r[3]=a/100;
    s[1]=b%10;  s[2]=(b/10)%10; s[3]=b/100;
    //r[]、s[] a,b的每一位的值
    if(r[1]==r[2]||r[2]==r[3]||r[1]==r[3])
        return 0;
    if(s[1]==s[2]||s[2]==s[3]||s[1]==s[3])
        return 0;
     //不与自身相同   
    for(int i=1;i<=3;i++)
        if(r[i]==0) return 0;
    for(int i=1;i<=3;i++)
        if(s[i]==0) return 0;
    //不含有0
    for(int k=1;k<=3;k++){
        for(int j=1;j<3;j++)
            if(s[k]==r[j])  return 0;
    }  //两数没有重复数值
    return 1;
	int main(){
    int a,b,c;
    for(int i=123;i<=329;i++){	//why 范围?
        a=i;    b=a*2;  c=a*3;
        if(pan(a,b)==1&&	          //三数互不相同
            pan(b,c)==1&&
            pan(a,c)==1){
            cout<<a<<" "<<b<<" "<<c<<endl;
        }
    }
}

概率+最大公约数求法

#include<bits/stdc++.h>
using namespace std;
int gcd(long m,long n)
{
    while (n != 0)
    {
        long rem = m % n;
        m = n;
        n = rem;
    }
    return m;
}
int main()
{
    int n;
    int a,b;
    int s1=1,s2=1;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>a>>b;
        s1*=(b-a);
        s2*=b;
    }
    int s=gcd(s1,s2);
    if((s2-s1)/s==0)
    {
        cout<<0;
    }
    else
    {
        cout<<(s2-s1)/s<<"/"<<s2/s;
    }
}

素数问题
1:

for (int i=0; i<=n; ++i)
        a[i]=true;
         a[1]=false;
         for (int i=2; i<=sqrt(n); ++i)
        if (a[i]) 
            for (int j=2; j<=n/i; ++j)
                a[i*j]=false;

2:

const ll N = 2000000;
using namespace std;
ll ordinary(ll n){  
  if(n==1)return 0;
    if(n==2)return 1; 
   for(int i=2;i<=sqrt(n);i++)  
         if(n%i==0)
		 return 0; 
   return 1;
}

猜你喜欢

转载自blog.csdn.net/qq_42785226/article/details/87607555