上学赛题解

比赛链接

前言:

ZHKZHK才不向GYXGYX一样连题解都懒得写,于是ZHKZHK写了。。。

T1T1WATERWATER

先看题意,就是看那些格子不能放SJBSJB,然后根据排列组合公式,最一个2n2^{n}的高精就行了,为什么要高精,因为最大值甚至可能是230302^{30*30}也就是29002^{900}

SoSo

LetsLet's looklook atat thethe code:code:

#include <bits/stdc++.h>
using namespace std;
int x[24000],y[24000];
string tostring(int a){
	if(a==0)return "0";
	string st="";
	while(a){
		st=char(a%10+48)+st;
		a/=10;
	}return st;
}
string jf(string a,int b){
    int c=-1,l1;
    string z="";
    for(int i=a.size()-1;i>=0;i--){
        c++;
        x[c]=a[i]-48;
    }l1=a.size();
    for(int i=0;i<l1;i++)y[i]=x[i]*b;
    for(int i=0;i<l1-1;i++){
        y[i+1]=y[i+1]+y[i]/10;
        y[i]=y[i]%10;
    }
    for(int i=l1-1;i>=0;i--)z=z+tostring(y[i]);
    return z;
}
int dx[8]={-1,1,0,0,-1,-1,1,1};
int dy[8]={0,0,-1,1,1,-1,1,-1};
int f[35][35];
int main(){
    int n;
    cin>>n;
	int a,b,x,y,s=0;
	cin>>a>>b>>x>>y;
	f[x][y]=1;
	for(int i=0;i<8;i++){
		int tx=x+dx[i],ty=y+dy[i];
		if(tx>=1&&tx<=n&&ty>=1&&ty<=n)f[tx][ty]=1;
	}
	if(f[a][b]==1){
		cout<<0;
		return 0;
	}
	for(int i=0;i<8;i++){
		int a1=a,b1=b;
		while(a1>=1&&a1<=n&&b1>=1&&b1<=n){
			f[a1][b1]=1;
			a1+=dx[i];
			b1+=dy[i];
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(!f[i][j])s++;
	if(s==0){
		cout<<0;
		return 0;
	}
	string st="1";
	for(int i=1;i<=s;i++)st=jf(st,2);
	cout<<st;
	return 0;
}

SoSo easy!easy! IsntIsn't it?it?

T2T2emem

貌似大家都懒得想,直接输样例那5050分了吧!样例分给的确实有点高。。。

这道题数据小得真的可怜。。。

正解:暴搜!!!

注意细节啦,其余的也没啥的吧。

SoSo

LetsLet's looklook atat thethe code:code:

#include <bits/stdc++.h>
using namespace std;
template<class T>inline void read(T &x){
	x=0;T f=1;char ch=getchar();
	for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-f;
	for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';
	x*=f;
}//王星钱的快读,我直接借他的抄了,不知道他会不会同意。。。
int a[260][260],b[260][260],f[260];
queue<int>x;
queue<int>y;
int main(){
	int n,m,t;
	read(n),read(m);read(t);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			read(a[i][j]),read(b[i][j]);
	x.push(m);
	y.push(t);
	while(x.size()){
		for(int i=1;i<=n;i++){
			if(f[x.front()]+b[x.front()][i]>f[i]&&y.front()>=a[x.front()][i]){
				f[i]=f[x.front()]+b[x.front()][i];
				x.push(i);
				y.push(y.front()-a[x.front()][i]);
			}
		}x.pop();
		y.pop();
	}cout<<f[m];
	return 0;
}

貌似wxq1229wxq1229大佬说可以最短路,emem,貌似不可以。

T3T3原题

貌似大家都去输样例得1010分了。。。

其实,这道题是有原题的。那么,是哪一道呢?LetLet meme telltell youyou

此处已对数据加强。

此处对数据加强。

SoSo

LetsLet's looklook atat thethe code:code:

#include <bits/stdc++.h>
using namespace std;
long long dp[5010][5010][2],s[5010],a[5010];
int main(){
	int n,c;
	cin>>n>>c;
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=n;i++){
		cin>>a[i]>>s[i];
		s[i]+=s[i-1];
	}
	dp[c][c][0]=0;
	dp[c][c][1]=0;
	for(int j=c;j<=n;j++)
		for(int i=j-1;i>=1;i--){
			dp[i][j][0]=min(dp[i+1][j][0]+(a[i+1]-a[i])*(s[i]+s[n]-s[j]),dp[i+1][j][1]+(a[j]-a[i])*(s[i]+s[n]-s[j]));
            dp[i][j][1]=min(dp[i][j-1][0]+(a[j]-a[i])*(s[i-1]+s[n]-s[j-1]),dp[i][j-1][1]+(a[j]-a[j-1])*(s[i-1]+s[n]-s[j-1]));
		}
	cout<<min(dp[1][n][1],dp[1][n][0]);
	return 0;
}

T4T4数据出水了。。。

本想卡O(Tmax(a,b))O(Tsqrt{max(a,b)})

然而,我没有成功。

现在,大家了解一下标程的复杂度O(Tlog2max(a,b))O(Tlog2{max(a,b)}),也就相当于gcdgcd复杂度!

SoSo

LetsLet's looklook atat thethe code:code:

#include <bits/stdc++.h>
using namespace std;
inline int read(){
    register int s=0,f=1;
    register char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f*=-1;ch=getchar();}
    while(isdigit(ch))s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
    return s*f;
}
void write(int x){
	if(x>9)write(x/10);
	putchar(x%10+48);
}
int gcd(int a,int b){
	if(a%b==0)return b;
	return gcd(b,a%b);
}
int f[1000010],h[600010],len;
int work(int x){
	int tot=0,y=1,z=x;
	pair<int,int>a[110];
	while(x>=h[y]){
		int s=0;
		while(x%h[y]==0)x/=h[y],s++;
		if(s)a[++tot]=make_pair(h[y],s);
		y++;
	}//for(int i=1;i<=tot;i++)cout<<i<<" "<<a[i].first<<" "<<a[i].second<<endl;
	if(tot==1)return z/a[1].first/a[1].first;
	else if(a[1].second==1)return z/a[2].first;
		else return z/min(a[1].first*a[1].first,a[2].first);
}
int main(){
	for(int i=2;i<=100000;i++)
		if(!f[i]){
			h[++len]=i;
			for(int j=i*2;j<=100000;j+=i)f[i]=1;
		}
	int T=read();
	while(T--){
		int a=read(),b=read(),x=gcd(a,b),y=1,s=0;
		if(f[x]==0)puts("0");
		else{
			write(work(x));puts("");
		}
	}
	return 0;
}

最后再说一句,本来我还想卡非快读的程序。。。

貌似 @zmxqs O(Tmax(a,b))O(Tsqrt{max(a,b)})的程序靠O2O2碾压标程

T5T5是从一道原题改编的

原题

在此,不细讲,请
不要忘记点赞哦!

T6T6送分

同样是一道原题,各个OJOJ上基本都有

这里给出洛谷网址

最后贴出主程序一行的程序

#include <bits/stdc++.h>
using namespace std;
inline int read(){
    register int s=0,f=1;
    register char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f*=-1;ch=getchar();}
    while(isdigit(ch))s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
    return s*f;
}
void write(int x){
	if(x>9)write(x/10);
	putchar(x%10+48);
}
int main(){
	wrtie(read()+read());
}//我才不写return 0呢

后记

本次比赛,yqm2007yqm2007多得了第11,恭喜他,这是他第11次获奖,可谓是小试牛刀,他将获得有skiygyxskiy_gyx提供的10RMBRMB

本次比赛共4646人得分,6464人报名,多人ACAC了我认为有难度的T4T4yqm2007yqm2007ACACT1T1

本次比赛圆满结束!

原文地址:https://www.cnblogs.com/zhaohaikun/p/12816987.html