其他分享
首页 > 其他分享> > 2019ICPC-银川站补题

2019ICPC-银川站补题

作者:互联网

下下周就要打icpc银川站了,今天和队友一起做了一套2019年的银川站的原题,感觉收获很多,也发现了很多问题。趁有时间补下题吧,也算是给自己积点幸运值。希望接下来的icpc银川站可以取得自己满意的成绩。菜鸡只希望拿个铜牌就行了。QAQ。

N. Fibonacci Sequence

签到题,直接输出非波纳西数列的前5项就行了,拼手速的话直接用python就行了。

print('1 1 2 3 5')

B. So Easy

给一个n行n列的矩阵,初始时全部都是0,可以对某一行整行或者某一列的整列进行同时加上某一个正数的操作。最后将某一个位置的数变为-1,问最后给出一个数列,是否可以找到这个-1上本来应该的值是多少。
我们直接对每行找出该行的最小值,然后同一行的所有数都减去这个最小值,对列执行同样的操作,但是要注意的是-1位置的行或者列的不可以进行处理。最后,求-1位置的该行的数与该列的数相加的结果的值就是我们要求的了,但是要注意-1的位置可能在边界的情况。

#include<iostream>
#include<cstring>

using namespace std;

int a[1010][1010];

int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	} 
	for(int i=1;i<=n;i++){
		int mi=1e9;
		for(int j=1;j<=n;j++){
			mi=min(mi,a[i][j]);
		}
		if(mi==-1) continue;
		for(int j=1;j<=n;j++){
			a[i][j]-=mi;
		}
	}
	for(int i=1;i<=n;i++){
		int mi=1e9;
		for(int j=1;j<=n;j++){
			mi=min(mi,a[j][i]);
		}
		if(mi==-1) continue;
		for(int j=1;j<=n;j++){
			a[j][i]-=mi;
		}
	}
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=n;j++){
//			cout<<a[i][j]<<" ";
//		}
//		cout<<endl;
//	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]==-1){
				int ans=0;
				if(i+1<=n){
					ans+=a[i+1][j];
				}else if(i-1>0){
					ans+=a[i-1][j];
				}
				if(j+1<=n){
					ans+=a[i][j+1];
				}else if(j-1>0){
					ans+=a[i][j-1];
				}
				cout<<ans<<endl;
				return 0;
			}
		}
	}
	return 0;
}

I. Base62

进制转换,大模拟题,用到的就是高精度加法,乘法和除法这三种。用C++的话相对比较麻烦,比赛的时候想用py的,但是发现不会将某一个字符的下标进行ASCII加减法,所以直接硬刚C++,最后三次罚时通过。赛后补题用Python直接一次通过,人生苦短,我用python。python用的是ord这个函数将字符转化为相应的ASCII码,相反,利用chr可以将ASCII转划为字符。但是,不管是C++还是python,都记得z为0的情况。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> sum,k[220],tmp;

vector<int> add(vector<int> &A,vector<int> &B){
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size()||i<B.size();i++){
        if(i<A.size())  t+=A[i];
        if(i<B.size())  t+=B[i];
        C.push_back(t%10);
        t/=10;
    }
    if(t)   C.push_back(t);
    return C;
}

vector<int> mul(vector<int> &A,int b){
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size()||t;i++){
        if(i<A.size())  t+=A[i]*b;//模拟
        C.push_back(t%10);
        t/=10;
    }
    while(C.size()>1&&C.back()==0)  C.pop_back();//排除前导0,b为0时会出现多余前导0
    return C;
}

vector<int> div(vector<int> &A,int b,int &r){
    vector<int> C;
    for(int i=A.size()-1;i>=0;i--){
        r=r*10+A[i];
        C.push_back(r/b);
        r%=b;
    }
    reverse(C.begin(),C.end());//翻转是为了方便去除前导0
    while(C.size()>1&&C.back()==0)  C.pop_back();
    return C;
}
void print(vector<int> a){
	for(int i=a.size()-1;i>=0;i--){
		cout<<a[i];
	}
	cout<<endl;
}
bool judge(vector<int> a){
	int Sum=0;
	for(int i=0;i<a.size();i++){
		Sum+=(a[i]);
	}
	if(Sum)  return true;
	return false;
}
int main(){
	int x,y;
	cin>>x>>y;
	string s;
	cin>>s;
	if(s=="0"){
		cout<<"0"<<endl;
		return 0;
	}
	if(x==y){
		cout<<s<<endl;
		return 0;
	}
	vector<int> v;
	for(int i=s.size()-1;i>=0;i--){
		v.push_back(s[i]-'0');
	}
	k[0].push_back(1);
	int len=s.size();
	for(int i=1;i<len+2;i++){
		k[i]=mul(k[i-1],x);
	}
	sum.push_back(0);
	for(int i=len-1;i>=0;i--){
		tmp.clear();
		tmp.push_back(0);
		int d=0;
		if(s[i]>='A'&&s[i]<='Z') d=s[i]-'A'+10;
		if(s[i]>='a'&&s[i]<='z') d=s[i]-'a'+36;
		if(s[i]<='9') d=s[i]-'0';
		int index=len-1-i;
		tmp=mul(k[index],d);
		sum=add(sum,tmp);
	}
	string res="";
	while(judge(sum)){
		int r=0;
		sum=div(sum,y,r);
//		print(sum);
//		cout<<"r:"<<r<<endl;
		if(r<10) res+=(r+'0');
		else if(r<36) res+=(r-10+'A');
		else res+=(r-36+'a');
	}
	reverse(res.begin(),res.end());
	cout<<res<<endl;
	return 0;
}

python代码:

x,y,s=input().split()
x=int(x)
y=int(y)
l=len(s)
if(s=="0"):
    print("0")
    exit(0)
sum=0
tmp=1
for i in range(0,l):
    k=0
    if s[l-i-1]<='Z' and s[l-i-1]>='A':
        k=ord(s[l-i-1])-ord('A')+10
    if s[l-i-1]<='z' and s[l-i-1]>='a':
        k=ord(s[l-i-1])-ord('a')+36
    if s[l-i-1]<='9':
        k=ord(s[l-i-1])-ord('0')
    sum+=tmp*k
    tmp=tmp*x
ans=[]
while sum>0:
    k=sum%y
    sum//=y
    if k<10:
        ans.append(chr(k+ord('0')))
    elif k<36:
        ans.append(chr(k-10+ord('A')))
    else:
        ans.append(chr(k-36+ord('a')))
ans.reverse()
l=len(ans)
for i in range(0,l):
    print(ans[i],end="")

后续继续补题。。。

标签:vector,cout,int,sum,mi,back,2019ICPC,补题,银川
来源: https://blog.csdn.net/TpeterH/article/details/116333832