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

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;
}

猜你喜欢

转载自blog.csdn.net/u013313909/article/details/126674383