【预备营Week1】题解。。。

1.大模拟。(乒乓球)

传送门

一道大模拟,就输入有点意思。。

while(~scanf("%c",&c) && c!='E')str[++cnt]=c;

针对以特定字符结尾的字符串。。。

上代码。。

#include<bits/stdc++.h>
using namespace std;
string str;
int cnt=0,saichang,W,L,js=1;
char c;
int main(){
	while(~scanf("%c",&c) && c!='E')str[++cnt]=c;
	while(js<=cnt){
		L=W=0;
		while(1){
			char o=str[js++];
			if(o=='W')W++;
			else if(o=='L')L++;
			else ;
			if(js>cnt || ((L>=11)&&(L-W>=2)) || ((W>=11)&&(W-L>=2)))break;
		}
		cout<<W<<":"<<L<<endl;
	}
	js=0;
	cout<<endl;
	while(js<=cnt){
		L=W=0;
		while(1){
			char o=str[js++];
			if(o=='W')W++;
			else if(o=='L')L++;
			else ;
			if(js>cnt || ((L>=21)&&(L-W>=2)) || ((W>=21)&&(W-L>=2)))break;
		}
		cout<<W<<":"<<L<<endl;
	}
	return 0;
}

2. 高精加。(第三题有函数可以直接用)

3.高精加乘除。

总之一句话,就把你当小学生,小学生该怎么算电脑就该怎么算。。。。

#include<bits/stdc++.h>
using namespace std;
int o[100000],js,len;
void G_C(string a,string b){//高精的乘法
	int lena=a.length();
	int lenb=b.length();
	len=lena+lenb;
	for(int i=1;i<=lena;i++){//取出a[lena-i] 
		js=0;
		for(int j=1;j<=lenb;j++){//取出b[lenb-i] 
			int A=a[lena-i]-'0';
			int B=b[lenb-j]-'0';
			o[i+j-1]+=A*B+js;
			js=o[i+j-1]/10;
			o[i+j-1]%=10;
		}
		o[i+lenb]+=js;
	}
	len-=(o[lena+lenb]==0?1:0);
	//for(int i=len;i>=1;i--)cout<<o[i];
	//cout<<endl;
}
void jia(string s1){//高精加法。。
	int Len=s1.length();
	js=0;
	for(int i=1;i<=len;i++){
		if(Len-i>=0)o[i]+=(s1[Len-i]-'0')+js;
		else o[i]+=js;
		js=o[i]/10;
		o[i]%=10;
	}
	if(js==1)o[++len]=js;
	//for(int i=len;i>=1;i--)cout<<o[i];
	//cout<<endl;
}
void chu(){//高精除法
	for(int i=len;i>=1;i--){
		o[i-1]+=(o[i]%2)*10;
		o[i]/=2;
	}
	len-=(o[len]?0:1);
	for(int i=len;i>=1;i--)cout<<o[i];
}
int main(){
	string s1,s2;
	cin>>s1;
	G_C(s1,s1);
	//cout<<s1<<endl;
	jia(s1);
	chu();
	return 0;
}

4.洛谷的高精度+dp

P1005 [NOIP2007 提高组] 矩阵取数游戏

思路:高精度+区间dp+记忆化;

代码:(未开o2)


#include<bits/stdc++.h>
using namespace std;
int n,m;
char buff[81];
string ans="0",ANS="0",mapp[81][81],dp[81][81];
string G_J(string a,string b){
	int lena=a.length();
	int lenb=b.length();
	if(lena<lenb){
		string c=a;
		a=b;
		b=c;
		swap(lena,lenb);
	}
	int js=0,A,B;
	int cnt=0;
	for(int i=1;i<=lena;i++){
		A=a[lena-i]-'0';
		B=b[lenb-i]-'0';
		if(lenb-i>=0)A+=B+js;
		else A+=js;
		js=A/10;
		A%=10;
		a[lena-i]='0'+A;
	}
	if(js)return '1'+a;
	else return a;
}
string G_C2(string a){
	int lena=a.length();
	int js=0,A;
	for(int i=1;i<=lena;i++){
		A=a[lena-i]-'0';
		A=A*2+js;
		js=A/10;
		A%=10;
		a[lena-i]='0'+A;
	}
	if(js)return '1'+a;
	else return a;
}
bool bijiao(string a,string b){
	int lena=a.length();
	int lenb=b.length();
	if(lena>lenb)return 1;
	else if(lena<lenb)return 0;
	else{
		for(int i=0;i<lena;i++){
			if(a[i]<b[i])return 0;
			if(a[i]>b[i])return 1;
		}
	}
	return 0;
}
string jiyihua[81][81][81];
int main(){
	cin>>n>>m;
	//for(int i=0;i<=100;i++)buff[i]='0';
	//cout<<buff<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>mapp[i][j];jiyihua[i][j][1]=G_C2(mapp[i][j]);
			for(int k=2;k<=m;k++){
				jiyihua[i][j][k]=G_C2(jiyihua[i][j][k-1]);
			}
		}
		int z=1,y=m;
		for(int j=1;j<=m;j++)for(int k=j;k<=m;k++)dp[j][k]=buff;
		ans=buff;
		for(int j=m;j>=1;j--){
			for(int k=1;k+j-1<=m;k++){
				if(k!=1){
					string AS=G_J(dp[k-1][k+j-1],jiyihua[i][k-1][m-j]);
					dp[k][k+j-1]=(bijiao(dp[k][k+j-1],AS)?dp[k][k+j-1]:AS);
				}
				if(k+j-1!=m){
					string AS=G_J(dp[k][k+j],jiyihua[i][k+j][m-j]);
					dp[k][k+j-1]=(bijiao(dp[k][k+j-1],AS)?dp[k][k+j-1]:AS);
				}
				if(j==1){
					string AS=G_J(dp[k][k],jiyihua[i][k][m]);
					ans=(bijiao(ans,AS)?ans:AS);
				}
				//cout<<dp[j][j+k-1]<<"   ";
			}
			//cout<<endl;
		}
		ANS=G_J(ans,ANS);
	}
	cout<<ANS;
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值