第一次个人训练(HDU6567——6577)

F.String 5672

简单题暴力解,存入字符串后,求’a’,‘v’,‘i’,‘n’的数量,个数乘积和总数4次方求最大公因数,输出个数积/公因数’/'总数四次方/公因数。

#include<cstdio>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}
int main()
{
	char ss[112];
	int n;
	while(cin>>n){
		scanf("%s",&ss);
		int i,a[4],s=0;
		memset(a,0,sizeof a);
		for(i=0;i<strlen(ss);i++){
			if(ss[i]=='a')	a[0]++;
			else if(ss[i]=='v')	a[1]++;
			else if(ss[i]=='i')	a[2]++;
			else if(ss[i]=='n') a[3]++;
		}
		int t=1;
		for(i=0;i<4;i++){
			if(a[i]==0){
				cout<<0<<'/'<<1<<endl;
				s=1;
				break;
			}
		}
		int c,r;
		if(s==0){
			for(i=0;i<4;i++){
				t*=a[i];
			}	
			c=strlen(ss)*strlen(ss)*strlen(ss)*strlen(ss);
			r=gcd(t,c); cout<<t/r<<'/'<<c/r<<endl;
		}
		
	}
		
	return 0;
}

G.Traffic 6573

暴力解,因为ai,bi最大只能为1000,数据范围很小,先存入数组a,b,在另设数组c,c[1]-c[100]设为0,将c[a]中的数设为1,然后循环从i=0开始判断,如果b数组全满足c[b+i]=0,就得到i。

#include<cstdio>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int ss[21234],a1[11234],b1[11234];

int main()
{
	int i,j,n,m,a;
	while(cin>>n>>m){
		for(i=0;i<n;i++)	scanf("%d",&a1[i]);
		for(i=0;i<m;i++)	scanf("%d",&b1[i]);
		memset(ss,0,sizeof ss);
		for(i=0;i<n;i++){
			ss[a1[i]]=1;
		}
		for(i=0;;i++){
			for(j=0;j<m;j++){
				a=b1[j]+i;
				if(ss[a]==1)	break;
			}
			if(j==m){
				cout<<i<<endl;
				break;
			}
		}
	}
	return 0;
}

H.Rng

考试时候看到这道题,是没一点头绪的,感觉要是硬算起来会很麻烦的。在听过讲解后,才知道数据是有规律的,这种题还是该算出几组数据,说不定就能得到规律了。
规律就是(n+1)/2nmod1e9+7.

#include<cstdio>
#include<stdio.h>
#include<iostream>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll ksm(ll x,ll y)
{
	ll res=1;
	while(y){
		if(y&1)	res=res*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return res%mod;
}

int main()
{
	ll x;
	while(cin>>x){
		cout<<(x+(ll)1)*ksm((ll)2*x,mod-2)%mod<<endl;
	}
	return 0;
}

I.Budget 6575

简单题,但,ai的范围过大,使用double也无法存入,只能以字符串的形式来存,通过判断最后一位的数来得最后的差。

#include<cstdio>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int main()
{
	int n;
	while(cin>>n){
		int b=0;
		char ss[100];
		int i;
		for(i=0;i<n;i++){
			scanf("%s",&ss);
			if(ss[strlen(ss)-1]<='4')	b-=(ss[strlen(ss)-1]-'0');
			else b=b+10-(ss[strlen(ss)-1]-'0');
		}
		printf("%.3lf\n",(double)b*0.001);
	}
	return 0;
}

J.Worker 6576

暴力解,起初在考虑如何求多个数的最大公因数上出了错,还错了好久。其他的没什么了。

#include<cstdio>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<bits/stdc++.h>
#include<cmath>
#include<algorithm>
using namespace std;
int lct(int a,int b){
	return a*b/(__gcd(a,b));
}
int a[1123],aa[11],aaa[11];
int main()
{
	int i,n,j;
	long long m;
	while(cin>>n>>m){
		memset(aa,0,sizeof aa);
		for(i=0;i<n;i++){
			cin>>a[i];
			aa[a[i]]++;
		}
		int s=0;
		j=0;
		for(i=1;i<=10;i++){
			if(aa[i]!=0){
				aaa[j]=i;
				j++;
			}
		}
		if(j==1){
			if(m%n==0){
				cout<<"Yes"<<endl;
				cout<<m/n;
				for(i=1;i<n;i++){
					cout<<' '<<m/n;
				}
				cout<<endl;
			}
			else	cout<<"No"<<endl;
		}
		else{
			int b=lct(aaa[0],aaa[1]);
			for(i=2;i<j;i++){
				b=lct(b,aaa[i]);
			}
			int c=0;
			for(i=0;i<n;i++){
				c+=b/a[i];
			}
			if(m%c==0){
				cout<<"Yes"<<endl;
				cout<<b/a[0]*(m/c);
				for(i=1;i<n;i++){
					cout<<' '<<b/a[i]*(m/c);
				}
				cout<<endl;
			}
			else	cout<<"No"<<endl;
		}
	}
	return 0;
}

K.Class 6577

简单的a+b问题。

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    int a,b;
    cin>>a>>b;
    cout<<(a+b)/2*(a-b)/2<<endl;
    return 0;
}

你可能感兴趣的:(个人训练)