国庆集训1

文章目录

  • 1. 国王游戏[洛谷](https://www.luogu.com.cn/problem/P1080)
  • 2.寻找道路[洛谷](https://www.luogu.com.cn/problem/P2296)
  • 3.海底珍珠串

1. 国王游戏洛谷

2.寻找道路洛谷

3.海底珍珠串


1.国王游戏

算法思路:题干里最大求最小,想到二分答案,还要排序,加个全排列
解法:很好,作者思路全错了,这垃圾题目 ,先找数学规律,再加高精度


#include
using namespace std;
int kingl,kingr;
int sum=-1;
int ans=1199999990;
struct node
{
     
	int l;
	int r;
}a[10010];
int qian[10010];
int solution[10010];
int b[10010];
int n;
void dfs(int x)
{
     
	if(x==n+1)
	{
     
		for(int i=1;i<=n;i++)
		{
     
		
			qian[i]=qian[i-1]*a[i-1].l;	
		}
		for(int i=1;i<=n;i++)
			sum=max(sum,qian[i]/a[i].r)	;

		ans=min(ans,sum);
	}
	else
	{
     
		for(int i=1;i<=n;i++)
		{
     
			if(b[i]==0)
			{
     
				b[i]=1;
				solution[x]=i;
				dfs(x+1);
				b[i]=0;
			}
		}		
	}
}
int main()
{
     
	qian[0]=1;
	cin>>n;
	cin>>kingl>>kingr;
	a[0].l=kingl;
	a[0].r=kingr;
	for(int i=1;i<=n;i++)
		cin>>a[i].l>>a[i].r;	
	dfs(1);
	cout<<ans;
} 

估分:60
得分:10(悲伤了,这时间卡的太死了吧)
订正代码:

#include 
using namespace std;
int now[20010],sum[20010],ans[20010],add[20010];
struct Node {
     
    int a;
    int b;
    long long a_b;
}node[1010];
int read() {
     
    int ans=0,flag=1;
    char ch=getchar();
    while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar();
    if(ch=='-') flag=-1,ch=getchar();
    while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar();
    return ans*flag;
}
void times(int x) {
     
    memset(add,0,sizeof(add));
    for(int i=1;i<=ans[0];i++) {
     
        ans[i]=ans[i]*x;
        add[i+1]+=ans[i]/10;
        ans[i]%=10;
    }
    for(int i=1;i<=ans[0]+4;i++) {
     
        ans[i]+=add[i];
        if(ans[i]>=10) {
     
            ans[i+1]+=ans[i]/10;
            ans[i]%=10;
        }
        if(ans[i]!=0) {
     
            ans[0]=max(ans[0],i);
        } 
    }
    return ;
}
int divition(int x) {
     
    memset(add,0,sizeof(add));
    int q=0;
    for(int i=ans[0];i>=1;i--) {
     
        q*=10;
        q+=ans[i];
        add[i]=q/x;
        if(add[0]==0 && add[i]!=0) {
     
            add[0]=i;
        }
        q%=x; 
    }
    return 0;
}
bool compare() {
     
    if(sum[0]==add[0]) {
     
        for(int i=add[0];i>=1;i--) {
     
            if(add[i]>sum[i]) return 1;
            if(add[i]<sum[i]) return 0;
        }
    }
    if(add[0]>sum[0]) return 1;
    if(add[0]<sum[0]) return 0;
}
void cp () {
     
    memset(sum,0,sizeof(sum));
    for(int i=add[0];i>=0;i--) {
     
        sum[i]=add[i];
    }
    return ;
}
bool cmp(Node a,Node b) {
     
    return a.a_b<b.a_b;
}
int main() {
     
    int n=read();
    for(int i=0;i<=n;i++) {
     
        node[i].a=read(),node[i].b=read();
        node[i].a_b=node[i].a*node[i].b;
    }
    sort(node+1,node+n+1,cmp);
    ans[0]=1,ans[1]=1;
    for(int i=1;i<=n;i++) {
     
        times(node[i-1].a);
        divition(node[i].b);
        if(compare()) {
     
            cp();
        }
    }
    for(int i=sum[0];i>=1;i--)
        printf("%d",sum[i]);
    return 0;
} 

2.寻找道路
算法思路:最短路
可能解法:最短路、

没写出来

估分:0
得分:0
订正代码

3.海底珍珠串
算法思路:毫无思路,作者直接找了个差不多的规律,骗分
可能解法:暴力求解可能行

#include
using namespace std;

int main()
{
     
	int ans=0;
	char c;
	int b[300010];
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
     
		cin>>c;
		int m=c;
	//	cout<
		b[m]++;
	}
	for(int i='a';i<='z';i++)
	{
     
		if(b[i]%2==1)
			ans++;
	}
	if(ans!=0)
		cout<<ans;
	else
		cout<<1;

	return 0;
}

估分:30
得分:
订正代码

在这里插入代码片

你可能感兴趣的:(算法,c++)