HDU 2081-2099

ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443

题目集合:http://acm.hdu.edu.cn/listproblem.php?vol=11
2081 手机短号

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

char a[15];
int t;
int main(){
	scanf("%d", &t);
	while(t--){
		scanf("%s",a);
		printf("6%s\n",a+6);
	}
	return 0;
}

2082 找单词

/*组合问题  母函数模板*/
/*
	a保存结果,b中间结果
	v权值 n1初始数量 n2终止数量 
*/
/*
#include<bits/stdc++.h>
#define ll long long
#define fo(i, j, n) for(int i=j; i<=n; ++i)
using namespace std;

int t,n,k,last,last2;
int a[51],b[51];
int v[26],n2[26];  // 权值,终止数量 
int main(){
	scanf("%d", &t);
	while(t--){
	//	memset(a,0,sizeof(a));
	//	memset(b,0,sizeof(b));
	//	memset(v,0,sizeof(v));
	//	memset(n2,0,sizeof(n2));
		
		fo(i, 0, 25) {
			scanf("%d", &n2[i]);
			v[i] = i+1;
		}
		
		a[0]=1;
		last = 0;
		fo(i,0,25){ // 第i个括号 
			last2 = min(last + n2[i]*v[i],50);    // 目前合并能达到最远项 
			memset(b,0,sizeof(int)*(last2+1));
			for(int j=0; j<=n2[i]&&j*v[i]<=last2; j++){	     // 遍历第i个括号的每一项 
				for(int k=0; k<=last&&k+j*v[i]<=last2; k++){  // 遍历a的每一项 
					b[k+j*v[i]] += a[k];
				}
			}
			memcpy(a,b,sizeof(int)*(last2+1));
			last = last2;
		}
		ll ans = 0;
		fo(i,1,50) if(a[i])ans += a[i];
		printf("%lld\n", ans);
	}
	return 0;
}c++

2083 简易版之最短距离


/*排序 然后最短距离所有点到中点的距离和*/
/*
#include<bits/stdc++.h>
#define ll long long 
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
int t,n,a[550];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		fo(i,1,n)scanf("%d",&a[i]);
		sort(a+1,a+n+1);// 注意不要漏掉+1 
		int x = n/2;
		int ans = 0;
		fo(i,1,x){
			ans += a[n+1-i]-a[i];
		}
		printf("%d\n",ans);
	} 
	return 0;
} 

2084 数塔

#include<bits/stdc++.h> 
#define ll long long
#define fo(i, j, n) for(int i=j; i<=n; ++i)
using namespace std;

int t,n,a[101][101];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		fo(i,1,n)
			fo(j,1,i)
				scanf("%d", &a[i][j]);
				
		for(int i=n-1; i>=1; i--)
			for(int j=1; j<=i; j++)
				a[i][j] += max(a[i+1][j], a[i+1][j+1]);
				
		printf("%d\n",a[1][1]);
	}
	return 0;
}

2085 核反应堆

#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
int n;
ll sum1,sum2,t1,t2;
int main(){
	while(scanf("%d",&n) && n!=-1){
		sum1 = 1;
		sum2 = 0;
		fo(i, 1, n){
			t1 = sum1;
			t2 = sum2;
			sum1 = 3*t1+2*t2;
			sum2 = t1+t2;
		}
		printf("%lld, %lld\n", sum1, sum2);
	}
	return 0;
}

2086 A1 = ?
/纯公式推导/
/*
2An + 2Cn - An-1 = An+1
2
An-1 + 2Cn-1 - An-2 = An

2A2 + 2C2 - A1 = A3
2
A1 + 2C1 - A0 = A2
上面的式子左右求和,整理得:
A1 = An+1 - An + A0 -2C(1,n) // C(1,n) 指的是c从1累加到n
对An进行同上面步骤求和,整理得:
A1 = An - An-1 + A0 -2
C(1,n-1)

A2 = A3 - A2 + A0 -2C(1,2)
A1 = A2 - A1 + A0 -2
C(1,1)
累加得:
nA1 = An+1 - A1 + nA0 - 2(C(1,1)+C(1,2)+…+C(1,n))
即:
A1 = (An+1 + nA0 + 2*(nC1+(n-1)C2+…+2Cn-1+1Cn)) / n+1
*/

#include<bits/stdc++.h>
#define ll long long
#define fo(i, j, n) for(int i=j; i<=n; ++i) 
using namespace std;

int n;
double ans,c_sum,a0,an1,c;
int main(){
	while(scanf("%d",&n) != EOF){
		scanf("%lf%lf",&a0,&an1);
		c_sum = 0;
		int nn = n;
		fo(i,1,n){
			scanf("%lf",&c);
			c_sum += c * nn--;
		}
		ans = (an1+n*a0-2*c_sum) / (n+1);
		printf("%.2f\n",ans);
	}
	return 0;
}

2087 剪花布条
KMP

#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

char s[1005], p[1005];
int n,m,ans,nxt[1005];
int main(){
	scanf("%s",s+1);
	while(strcmp(s+1,"#")!=0){
		scanf("%s", p+1);
		n = strlen(s+1);
		m = strlen(p+1);
		
		nxt[0] = -1;
		int j = -1;
		fo(i, 1, m){
			while(j>=0 && p[j+1]!=p[i]) j = nxt[j];
			nxt[i] = ++j;
		}
		j = 0;
		ans = 0;
		fo(i,1,n){
			while(j>=0 && p[j+1]!=s[i]) j = nxt[j];
			if(++j==m){
				ans++;
				j=0;
			}
		}
		printf("%d\n",ans);
		scanf("%s",s+1);
	}
	return 0;
}

2088 Box of Bricks
/注意输出格式/
/英文阅读。。。注意模拟/

#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a);
#define pf(a) printf("%lld\n", a);
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

int n,a[55],sum;
ll ans;
int main(){
	sf(n);
	while(n!=0){
		sum = 0;
		fo(i,1,n){
			sf(a[i]);
			sum += a[i];
		}
		int avg = sum/n;
		ans = 0;
		fo(i,1,n)
			if(a[i]>avg) ans += a[i]-avg;
		pf(ans); 
		sf(n);
		if(n)printf("\n");
	}
	return 0;
}

2089 不要62

/*
	sscanf(str,"%d",&a);
	sprintf(str,"%.3lf",a);
	sprintf(str,"%x",a);//10进制转换成16进制,如果输出大写的字母是sprintf(str,"%X",a)
*/
#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%d\n", a) 
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

char str[1000010];
int a[1000010];
void init(){
	fo(i,1,1000000){
	 // 数字,字符串,进制 
	 	sprintf(str,"%d",i);
		if(strstr(str, "4")!=NULL) { // 子串判断 
			a[i] += a[i-1]+1;
		}else if(strstr(str, "62")!=NULL) { // 子串判断 
			a[i] += a[i-1]+1; 
		}else a[i] = a[i-1];
	//	pf(a[i]);
	}
}
int n,m;
int main(){
	init();
	while(sf(n)&&sf(m) && (n!=0||m!=0)){
		pf((m-n+1)-(a[m]-a[n-1])); //  注意要减去1 
	}
	return 0;
}

2090 算菜价

#include <stdio.h>
char c[1000];
int main()
{
	double a,b,sum=0;
	while(scanf("%s%lf%lf",c,&a,&b)!=EOF)
	{
		sum+=a*b;
	}
	printf("%.1f\n",sum);
	return 0;
}

2091 空心三角形

#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%c", a) 
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

char c;
int n;
int main(){
	bool flag = 0;
	while(scanf("%c",&c) && c!='@' && sf(n)){
		getchar(); // 读取末尾换行符号 
		if(flag)pf('\n');
		flag = 1;
		int t = n-1;
		fo(j,1,t) pf(' ');pf(c);pf('\n');
		int zj = 1;
		fo(i,2,n-1){
			t--;
			fo(j,1,t) pf(' ');pf(c);
			fo(j,1,zj) pf(' ');pf(c);pf('\n');
			zj+=2;
		}
		if(n>1){fo(i,1,2*n-1)pf(c);pf('\n');} // 没判断n,wa了几次。。。 
	}	
	return 0;
}

2092 整数解

/*解一元二次方程*/
#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%d", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
int n,m;
int main(){
	while(sf(n) && sf(m) && (n||m)){
		int dt = n*n-4*m;
		if(dt<0){
			puts("No");continue; // 无解 
		}
		double x1 = (n+sqrt(dt))/2;
		double x2 = (n-sqrt(dt))/2;
		if((int)x1==x1 && (int)x2==x2)puts("Yes");	
		else puts("No");		
	}
	return 0;
}

2093 考试排名

#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%d", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
struct Student{
	char name[50];
	int sum;
	int time;	
	// 最大堆 
	bool operator < (const Student &a) const{
		if(sum==a.sum) 
			if(time==a.time)return strcmp(name,a.name)>0;
			else return time>a.time;
		else return sum < a.sum;
	}
};
// 处理一个题的成绩 
void calc(char *c, Student &st, int f){
	if(c[0]=='0' || c[0]=='-') return;
	int res = c[0]-'0';
	int len = strlen(c);
	int j = len-1;
	fo(i,1,len-1){
		if(c[i]=='('){
			j = i;
			break;
		}
		res *= 10;
		res += c[i]-'0';
	}
	int time =0;
	if(j!=len-1){
		time = c[j+1]-'0';
		fo(i,j+2,len-1){
			if(c[i]==')') break;
			time *= 10; 
			time += c[i]-'0'; 
		}
	}
	st.sum += 1;
	st.time += res+time*f;
}
int n, m;
priority_queue<Student> q;
Student stu;
char c[100];
int main(){
	cin >> n >> m;
	while(cin>>stu.name){
		stu.sum=0;
		stu.time=0;
		fo(i,1,n){
			scanf("%s",c);
			calc(c,stu,m);
		}
		q.push(stu);
	}
	while(!q.empty()){
		stu = q.top();
		q.pop();
		printf("%-10s %2d %4d\n",stu.name,stu.sum,stu.time);
	}
	return 0;
}
/*8 20
Smith  -1 -16 8 0 0 120 39 0
John 116 -2  11 0 0 82 55(1) 0
Josephus 72(3) 126 10 -3 0 47 21(2) -2
Bush 0 -1 -8 0 0 0 0 0
Alice -2 67(2) 13 -1 0 133 79(1) -1
Bob 0 0 57(5) 0 0 168 -7 0*/

2095 find your present (2)
/* 寻找出现奇数次的数,异或运算 */

#include<bits/stdc++.h>
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

template <class T>
inline bool sf(T &ret){
	char c; int	sgn;
	if(c=getchar(),c==EOF)return 0; // EOF
	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
	sgn=(c=='-')?-1:1;
	ret=(c=='-')?0:(c-'0');
	while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
	ret *= sgn;
	return 1;
}
int n,ans=0,a;
int main(){
	while(sf(n) && n){
		ans = 0;
		fo(i,1,n){
			sf(a);
			ans ^= a;
		}
		pf(ans);
	}
	return 0;
}

2096 小明A+B

#include<bits/stdc++.h>
#define ll long long
#define pf(a) printf("%d\n",a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

template <class T>
inline bool sf(T &ret){
	char c; int sgn;
	if(c=getchar(), c==EOF) return 0; // EOF
	while(c!='-' && (c<'0'||c>'9')) c=getchar();
	sgn = (c=='-')?-1:1;
	ret = (c=='-')?0:(c-'0');
	while(c=getchar(),c>='0'&&c<='9')ret = ret*10+(c-'0');
	ret *= sgn;
	return 1;
}
const int mod = 100;
int a,b,ans,n;
int add(int a, int b){
	a %= mod;
	b %= mod;
	return (a+b)%mod;
}
int main(){
	sf(n);
	while(n--){
		sf(a);sf(b);
		ans = add(a,b);
		pf(ans);
	}
	return 0;
}

2097 Sky数

#include<bits/stdc++.h> 
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

template <class T>
inline bool sf(T &ret){
	char c; int sgn;
	if(c=getchar(), c==EOF) return 0; //EOF
	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
	sgn = (c=='-')?-1:1;
	ret = (c=='-')?:(c-'0');
	while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
	ret *= sgn;
	return 1; 
}
int sky(int a, int n){
	int res = 0;
	while(a){
		res += a%n;
		a /= n;
	}
	return res;	
} 

int n,sk10,sk12,sk16;
int main(){
	while(sf(n)&&n){
		sk10 = sky(n,10);
		sk12 = sky(n,12);
		sk16 = sky(n,16);
		if(sk10==sk12 && sk10==sk16)
			printf("%d is a Sky Number.\n",n);
		else printf("%d is not a Sky Number.\n",n);
	}
	return 0;
}

2098 分拆素数和

#include<bits/stdc++.h> 
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

template <class T>
inline bool sf(T &ret){
	char c; int sgn;
	if(c=getchar(), c==EOF) return 0; //EOF
	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
	sgn = (c=='-')?-1:1;
	ret = (c=='-')?:(c-'0');
	while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
	ret *= sgn;
	return 1; 
}
const int MAXN=10000;
int prime[MAXN+1];
bool isPrime[MAXN+1];
void getPrime(){
	memset(prime,0,sizeof(prime));
	for(int i=2;i<=MAXN; i++){
		if(!prime[i]) {
			prime[++prime[0]]=i;
			isPrime[i] = 1;
		//	cout << prime[0] << " " << i << endl;
		}
		for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++){
			prime[prime[j]*i]=1;
			if(i%prime[j]==0)break;
		}
	} 
}
int n,ans;
int main(){
	getPrime();
	while(sf(n)&&n){
		ans = 0;	
		fo(i,1,n){
			if(prime[i]>=n/2 || prime[i]==1)break;
			if(isPrime[n-prime[i]])ans++;
		}
		pf(ans);
	}
	return 0;
}

2099 整除的尾数

#include<bits/stdc++.h> 
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

template <class T>
inline bool sf(T &ret){
	char c; int sgn;
	if(c=getchar(), c==EOF) return 0; //EOF
	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
	sgn = (c=='-')?-1:1;
	ret = (c=='-')?:(c-'0');
	while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
	ret *= sgn;
	return 1; 
}
int a, b;

int main(){
	while(sf(a)&&sf(b)&&(a||b)){
		a*=100;
		bool flat = 0;
		fo(i,0,99){
			if((a+i)%b==0){
				if(flat){
					if(i<=9)printf(" %d%d",0,i);
					else    printf(" %d",i);
				}else{
					flat = 1;
					if(i<=9)printf("%d%d",0,i);
					else    printf("%d",i);
				}
			}
		}
		printf("\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值