Ch02 暴力求解

习题2.1 与7无关的数(PKU)

#include<bits/stdc++.h>
using namespace std;
int n,ans;
bool check(int x){
	if(x%7==0) return false;
	while(x!=0){
		if(x%10==7){
			return false; 
		}
		x/=10;
	}
	return true;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		if(check(i)){
			ans+=i*i;
		}
	}
	cout<<ans<<endl;
} 

习题2.2 百鸡问题(HIT)

#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
	cin>>n;
	for(int x=0;x<=n/5;x++){
		for(int y=0;y<=n/3;y++){
			int z=100-x-y;
			if(z<0) continue;
			if(5*x+3*y+(double)z/3<=n){
				cout<<"x="<<x<<",y="<<y<<",z="<<z<<endl;
			}
		}
	}
} 

习题2.3 Old Bill(SJTU)

#include<bits/stdc++.h>
using namespace std;
bool ok=false;
int n,x,y,z,A,B,C;
void solve(){
	for(int a=9;a>=1;a--){
		for(int b=9;b>=0;b--){
			int total=10000*a+x*1000+100*y+10*z+b;
			if(total%n==0){
				A=a,B=b,C=total/n;
				ok=true;
				return;
			}
		}
	}
}
int main(){
	while(cin>>n>>x>>y>>z){
		ok=false;
		solve();
		if(ok){
			cout<<A<<" "<<B<<" "<<C<<endl;
		}
		else{
			cout<<0<<endl; 
		}
	}
} 

习题2.4 Repeater(PKU)

#include<bits/stdc++.h>
using namespace std;
char pattern [6][6];
char m[3000][3000];
char ans[3000][3000];
int len,n,q;
void update(int x,int y,bool flag){
	for(int i=0;i<len;i++){
		for(int j=0;j<len;j++){
			if(flag){
				ans[x+i][y+j]=m[i][j];
			}
			else{
				ans[x+i][y+j]=' ';
			}
		}
	}
}
int main(){
	while(cin>>n){
		if(n==0) break;cin.get();
		for(int i=0;i<n;i++){
			cin.getline(pattern[i],6);
		}
		cin>>q;
		for(int k=0;k<q;k++){
			len=pow(n,k);
			if(len==1){
				for(int i=0;i<n;i++){
					for(int j=0;j<n;j++){
						m[i][j]=pattern[i][j];
						ans[i][j]=m[i][j];
					}
				}
			}
			else{
				for(int i=0;i<n;i++){
					for(int j=0;j<n;j++){
						if(pattern[i][j]==' '){
							update(i*len,j*len,false);
						}
						else{
							update(i*len,j*len,true);
						}
					}
				}
				for(int i=0;i<len*n;i++){
					for(int j=0;j<len*n;j++){
						m[i][j]=ans[i][j];
					}
				}
			}
		}
		len=pow(n,q);
		for(int i=0;i<len;i++){
			for(int j=0;j<len;j++){
				cout<<ans[i][j];
			}
			cout<<endl;
		}
	}
} 

习题2.5 Hello World for U(ZJU)

#include<bits/stdc++.h>
using namespace std;
string s;
char ans[80][80];
int n;
int main(){
	while(getline(cin,s)){
		for(int i=0;i<80;i++){
			for(int j=0;j<80;j++){
				ans[i][j]=' ';
			}
		}
		int n=s.length();
		int x=(n+2)/3;
		int y=n-2*x+2;
		for(int i=0;i<=x-1;i++){
			ans[i][0]=s[i];
			ans[i][y-1]=s[n-1-i];
		}
		for(int j=1;j<=y-2;j++){
			ans[x-1][j]=s[x-1+j];
		}
		for(int i=0;i<=x-1;i++){
			for(int j=0;j<=y-1;j++){
				cout<<ans[i][j];
			}
			cout<<endl;
		}
	}
} 

习题2.6 日期差值(SJTU)

#include<bits/stdc++.h>
using namespace std;
char a[9],b[9];
int daytab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
int ans=1;
bool IsLeapYear(int year){
	return year%400==0||year%4==0&&year%100!=0;
}
int NumberOfYear(int year){
	if(IsLeapYear(year)){
		return 366;
	}
	else{
		return 365;
	}
}
int main(){
	int year1,month1,day1;
	int year2,month2,day2;
	while(cin>>a>>b){
		sscanf(a,"%4d%2d%2d",&year1,&month1,&day1);
		sscanf(b,"%4d%2d%2d",&year2,&month2,&day2);
		while(year1<year2||month1<month2||day1<day2){
			day1++;
			if(day1==daytab[IsLeapYear(year1)][month1]+1){
				month1++;
				day1=1;
			}
			if(month1==13){
				year1++;
				month1=1;
			}
			ans++;
		}
		cout<<ans<<endl;
	}	
}

习题2.7 Day of Week(SJTU)

#include<bits/stdc++.h>
using namespace std;
map<string,int> mp({{"January",1},{"February",2},{"March",3},{"April",4},{"May",5},{"June",6},
{"July",7},{"August",8},{"September",9},{"October",10},{"November",11},{"December",12}});
map<int,string>mp2({{0,"Sunday"},{1,"Monday"},{2,"Tuesday"},{3,"Wednesday"},{4,"Thursday"},{5,"Friday"},{6,"Saturday"}});
int daytab[2][13]={
	{0,31,28,31,30,31,30,31,31,30,31,30,31},
	{0,31,29,31,30,31,30,31,31,30,31,30,31}	
};
bool IsLeapYear(int year){
	return year%400==0||year%4==0&&year%100!=0;
}
int NumberOfYear(int year){
	if(IsLeapYear(year)){
		return 366;
	}
	return 365;
} 
string s;
int main(){
	while(getline(cin,s)){
		stringstream ss(s);
		int day,month,year;string m;
		ss>>day;ss>>m;month=mp[m];ss>>year;
		int number=0;//计算该天是本年的第几天
		int row=IsLeapYear(year);
		for(int j=0;j<month;j++){
			number+=daytab[row][j];
		} 
		number+=day;
		for(int i=2;i<=year;i++){
			number+=NumberOfYear(i-1);
		}
		number%=7;
		cout<<mp2[number]<<endl;
	}
} 

习题2.8 日期类(BIT)

#include<bits/stdc++.h>
using namespace std;
int daytab[2][13]={
	{0,31,28,31,30,31,30,31,31,30,31,30,31},
	{0,31,29,31,30,31,30,31,31,30,31,30,31}
}; 
bool IsLeapYear(int year){
	return (year%400==0)||(year%4==0&&year%100==0);
}
int m;
int year,day,month;
int main(){
	cin>>m;	
	while(m--){
		cin>>year>>month>>day;
		day+=1;
		if(day>daytab[IsLeapYear(year)][month]){
			day=1;
			month++;
		}
		if(month>12){
			month=1;
			year++; 
		}
		printf("%04d-%02d-%02d\n",year,month,day);
	}
}

习题2.9 Grading(ZJU)

#include<bits/stdc++.h>
using namespace std;
int P,T,G1,G2,G3,GJ;double ans;
int main(){
	while(cin>>P>>T>>G1>>G2>>G3>>GJ){
		if(abs(G1-G2)<=T){
			ans=(double)(G1+G2)/2;
		}
		else if(abs(G1-G3)<=T||abs(G2-G3)<=T){
			if(abs(G1-G3)<=T&&abs(G2-G3)<=T){
				ans=max(G1,max(G2,G3));
			}
			else{
				if(abs(G1-G3)>=(G2-G3)){
					ans=(double)(G1+G3)/2;
				}
				else{
					ans=(double)(G2+G3)/2;
				} 
			}
		}
		else{
			ans=GJ;
		} 
		printf("%.1f\n",ans);
	}
} 

习题2.10 路径打印(SJTU)

#include<bits/stdc++.h>
using namespace std;
int n;
string path[11];
vector<string> pre,now;
void solve(){
	for(int j=0;j<n;j++){
		cin>>path[j]; 
	}
	sort(path,path+n);
	for(int j=0;j<n;j++){
		for(int i=0;i<path[j].size();i++){
			if(path[j][i]=='\\'){
				path[j][i]=' ';
			}
		}
		stringstream ss(path[j]);
		string tmp;
		while(ss>>tmp){
			now.push_back(tmp);
		}
		int p1=0,p2=0,retract=0;
		while(p1<pre.size()&&p2<now.size()&&pre[p1]==now[p2]){
			p1++;p2++;retract+=2;
		}
		for(;p2<now.size();p2++){
			for(int i=0;i<retract;i++){
				cout<<" "; 
			}
			cout<<now[p2]<<endl;
			retract+=2;
		}		
		pre=now;
		now.clear();
	}
}
int main(){
	while(cin>>n&&n!=0){
		solve();
		cout<<endl;
	}	
} 

习题2.11 坠落的蚂蚁(PKU)

参考链接

#include<bits/stdc++.h>
using namespace std;
struct ant{
	int pos,v;
	bool operator<(const ant & p) const{
		return pos<p.pos;
	}
}arr[100];
vector<ant> l,r;
int n,a;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>arr[i].pos>>arr[i].v;
		if(arr[i].v==0) a=i;
	}
	for(int i=0;i<n;i++){
		if(arr[i].pos<arr[a].pos&&arr[i].v>0){
			l.push_back(arr[i]);
		}
		if(arr[i].pos>arr[a].pos&&arr[i].v<0){
			r.push_back(arr[i]);
		}		
	}
	sort(l.begin(),l.end());
	sort(r.begin(),r.end());		
	int l1=l.size(),l2=r.size();
	if(l1==l2){
		cout<<"Cannot fall!\n";
	}
	else if(l1<l2){
		cout<<r[l1].pos<<endl;
	}
	else {
		cout<<100-l[l1-l2-1].pos<<endl; 
	}	
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值