Jzoj 枚举算法部分题目(共12题)

本文集合了多个编程竞赛题目,展示了如何运用数学和算法知识解决复杂问题。包括寻找平方数的平方根、计算因子个数、解决逻辑谜题、寻找素数序列、优化交易策略、计算牛之间的距离以及处理回声问题。这些例子揭示了在编程中数学思维的重要性以及如何通过迭代和逻辑推理找到解决方案。
摘要由CSDN通过智能技术生成

2786【入门】aabb

#include <bits/stdc++.h>
using namespace std;
int num, aa, bb, temp;
int main()
{
//	printf("7744");
//	for(int i=30; i<=100; ++i){
//		num=i*i;
//		if(num>=1000 && num<=9999){
//			aa=num/100;
//			bb=num%100;
//			if(aa%11==0 && bb%11==0){
//				printf("%d\n", num);
//			}
//		}
//	}
	for(int i=1; i<=9; ++i){
		for(int j=0; j<=9; ++j){
			num=i*1000+i*100+j*10+j;
			temp=sqrt(num);
			if(temp*temp==num){
				printf("%d\n", num);
			}
		}
	}
	return 0;
}

1999【基础】因子个数

#include <bits/stdc++.h>
using namespace std;
int n, temp, ans;
int main()
{
	scanf("%d", &n);
	for(int i=1; i<=sqrt(n); ++i){
		if(n%i==0){
			ans+=2;
		}
	}
	temp=sqrt(n);
	if(temp*temp==n){
		ans--;
	}
	printf("%d", ans);
	return 0;
}

1995【入门】桐桐的计算

#include <bits/stdc++.h>
using namespace std;
int n, ans;
int main()
{
	for(int i=0; i<=11; ++i){	//九头鸟的只数 
		for(int j=0; j<=100; ++j){	//鸡的只数 
			int k=100-9*i-j;		//兔的数量 
			if(k>=0 && i*2+j*2+k*4==100){
				ans++;
				printf("%d %d %d\n", i, j, k);
			}
		}
	}
	printf("%d", ans);
	return 0;
}

1772: 【USACO】牛友

#include <bits/stdc++.h>
using namespace std;
int s, cow1, cow2;
int sum(int n) 	
{
	int ans=1;
	for(int i=2; i<=sqrt(n); ++i){
		if(n%i==0){
			ans+=i;
			ans+=n/i;
		}
		if(i*i==n){
			ans-=i;
		}
	}
	return ans;
}
int main()
{
	scanf("%d", &s);
	for(int i=s; i>0; ++i){		//枚举第一头奶牛 
		//计算第一头奶牛i的约数和cow2,即第二头奶牛 
		cow2=sum(i);			
		//计算第二头奶牛的约数和,看是否等于第一头奶牛的编号
		cow1=sum(cow2);			 
		if(cow1==i && cow2!=i){
			printf("%d %d", cow1, cow2);
			return 0;
		}
	}
}

1196: 【基础】圆环上求素数

#include <bits/stdc++.h>
using namespace std;
int a[20], l, num, cnt, ans[11];
//判断是否为素数 
bool prim(int n)
{
	if(n<2){
		return false;
	}
	for(int i=2; i<=sqrt(n); ++i){
		if(n%i==0){
			return false;
		}
	}
	return true;
}
int main()
{
	scanf("%d", &l);
	for(int i=0; i<=9; ++i){
		a[i]=i;
		a[i+10]=i;	//处理圈的问题 
	}
	for(int i=1; i<=9; ++i){	//起点从1开始 
		num=0;
		for(int j=0; j<l; ++j){	//长度 
			num=num*10+a[i+j];
		}
		if(prim(num)){	
			cnt++;
			ans[cnt]=num;
		}
	}
	for(int i=1; i<=cnt; ++i){
		printf("%d", ans[i]);
		if(i!=cnt){		//不是最后一个数, 输出逗号 
			printf(",");
		}
	}
	return 0;
}

1257: 【基础】圆环上求素数II

#include <bits/stdc++.h>
using namespace std;
int a[33], l, num, cnt, ans[11], id;
//判断是否为素数 
bool prim(int n)
{
	if(n<2){
		return false;
	}
	for(int i=2; i<=sqrt(n); ++i){
		if(n%i==0){
			return false;
		}
	}
	return true;
}
int main()
{
	for(int i=0; i<=9; ++i){
		scanf("%d", &a[i]);
		if(a[i]==1){	//记录1的位置 
			id=i;
		}
		a[i+10]=a[i];	//处理圈的问题 
		a[i+20]=a[i];	//处理圈的问题 
	} 
	scanf("%d", &l);
	for(int i=id; i<id+9; ++i){	//起点从1开始 
		num=0;
		if(a[i]==0){	//最高位为0 
			continue;
		}
		for(int j=0; j<l; ++j){	//长度 
			num=num*10+a[i+j];
		}
		if(prim(num)){	
			cnt++;
			ans[cnt]=num;
		}
	}
	for(int i=1; i<=cnt; ++i){
		printf("%d", ans[i]);
		if(i!=cnt){		//不是最后一个数, 输出逗号 
			printf(",");
		}
	}
	return 0;
}

1569: 【NOIP98普及组】1:2:3

#include <bits/stdc++.h>
using namespace std;
int num1, num2, num3; 
bool vis[11];
int main()
{
	for(int a=1; a<=9; ++a){
		if(vis[a]){
			continue;
		}
		vis[a]=true;
		for(int b=1; b<=9; ++b){
			if(vis[b]){
				continue;
			}
			vis[b]=true;
			for(int c=1; c<=9; ++c){
				if(vis[c]){
					continue;
				}
				vis[c]=true;
				for(int d=1; d<=9; ++d){
					if(vis[d]){
						continue;
					}
					vis[d]=true;
					for(int e=1; e<=9; ++e){
						if(vis[e]){
							continue;
						}
						vis[e]=true;
						for(int f=1; f<=9; ++f){
							if(vis[f]){
								continue;
							}
							vis[f]=true;
							for(int g=1; g<=9; ++g){
								if(vis[g]){
									continue;
								}
								vis[g]=true;
								for(int h=1; h<=9; ++h){
									if(vis[h]){
										continue;
									}
									vis[h]=true;
									for(int i=1; i<=9; ++i){
										if(vis[i]){
											continue;
										}
										vis[i]=true;
										num1=a*100+b*10+c;
										num2=d*100+e*10+f;
										num3=g*100+h*10+i;
										if(num1*2==num2 && num1*3==num3){
											printf("%d %d %d\n", num1, num2, num3);
										}
										vis[i]=false;
									}		
									vis[h]=false;							
								}	
								vis[g]=false;
							}	
							vis[f]=false;
						}	
						vis[e]=false;
					}		
					vis[d]=false;	
				}	
				vis[c]=false;
			}	
			vis[b]=false;
		}	
		vis[a]=false;
	}
	return 0;
}

1496: 【USACO】晚餐队列安排

好题,思维,前缀和

#include <bits/stdc++.h>
using namespace std;
int n, a[30010], num1, num2, ans=30010, cnt1[30010], cnt2[30010], temp;
int main()
{
	scanf("%d", &n);
	for(int i=1; i<=n; ++i){
		scanf("%d", &a[i]);
		if(a[i]==1){
			cnt1[i]=cnt1[i-1]+1;	//记录a[1]~a[i]有多少个1 
			cnt2[i]=cnt2[i-1];		//延续上一个 
			num1++;
		}
		else{
			cnt2[i]=cnt2[i-1]+1;	//记录a[1]~a[i]有多少个2
			cnt1[i]=cnt1[i-1];		//延续上一个
			num2++;
		}
	}
	ans=min(num1, num2);	//全1或者全2 
	for(int i=1; i<n; ++i){	//枚举1的队尾 
		//a[1]~a[i]的2都变为1, a[i+1]~a[n]的1都变为2
		temp=cnt2[i]+cnt1[n]-cnt1[i];
		ans=min(ans, temp);
	}
	printf("%d", ans);
	return 0;
}

1522: 【USACO】第一次,第二次,成交!

#include <bits/stdc++.h>
using namespace std;
const int M=1010;
int n, m, p[M], curprice, price, curans, ans; 
int main()
{
	scanf("%d %d", &n, &m);
	//m个客户的出价 
	for(int i=1; i<=m; ++i){
		scanf("%d", &p[i]);
	}
	sort(p+1, p+m+1);
	for(int i=1; i<=m; ++i){
		curprice=p[i];
		curans=min(n, m-i+1)*curprice;
		if(curans>ans){
			ans=curans;
			price=curprice;
		}
	}
	printf("%d %d", price, ans);
	return 0;
}

1595: 【USACO】Claustrophobic Cows(患自闭症的牛)

#include <bits/stdc++.h>
using namespace std;
int n, ans1, ans2;
long long mn=3e10;
struct cow
{
	int id;
	long long x, y;
}a[2010];
long long cal(int p, int q)
{
	return (a[p].x-a[q].x)*(a[p].x-a[q].x)+(a[p].y-a[q].y)*(a[p].y-a[q].y);
}
int main()
{
	scanf("%d", &n);
	for(int i=1; i<=n; ++i){
		a[i].id=i;
		scanf("%lld %lld", &a[i].x, &a[i].y);
	}
	for(int i=1; i<n; ++i){
		for(int j=i+1; j<=n; ++j){
			if(cal(i, j)<mn){
				mn=cal(i, j);
				ans1=i;
				ans2=j;
			}
		}
	}
	printf("%d %d", ans1, ans2);
	return 0;
}

1586: 【USACO】牛棚回声

//最长公共子序列 
#include <bits/stdc++.h>
using namespace std;
int length1, length2, mx, temp;
string s1, s2;
int main()
{
	cin >> s1;
	cin >> s2;
	length1=s1.length();
	length2=s2.length();
	for(int i=0; i<length1; ++i){	//枚举第一个字符串的起点 
		for(int j=0; j<length2; ++j){	//枚举第二个字符串的起点 
			if(s1[i]==s2[j]){		//如果两个起点相同 
				temp=1;				//公共长度记为1 
				while(1){			//看后面的第temp位是否也相同	
					if(s1[i+temp]==s2[j+temp]){		//相同 
						temp++;		//最长公共子序列长度加一 
					}
					else{			//只要某一位不同 
						break;		//跳出 
					}
				}
				mx=max(mx, temp);	//更新擂主 
			}
		}
	}
	printf("%d", mx);
	return 0;
}

1792: 【NOIP08提高组】火柴棒等式

#include <bits/stdc++.h>
using namespace std;
int n, a[10]={6, 2, 5, 5, 4, 5, 6, 3, 7, 6}, ans, cnt;
int cal(int x)
{
	int asd=0;
	if(x==0){
		return 6;
	}
	while(x){
		asd+=a[x%10];
		x/=10;
	}
	return asd;
}
int main()
{
	scanf("%d", &n);
	n-=4;	//最多20根火柴可以用来拼数字 
	for(int i=0; i<=1000; ++i){
		for(int j=0; j<=1000; ++j){
			if(cal(i)+cal(j)+cal(i+j)==n){
//				printf("%d + %d = %d\n", i, j, i+j);
//				printf("%d   %d   %d\n", cal(i), cal(j), cal(i+j));
				ans++;
			}
		}
	}
	ans-=cnt;
	printf("%d", ans);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ypeijasd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值