1. 国王游戏洛谷
2.寻找道路洛谷
3.海底珍珠串
1.国王游戏
算法思路:题干里最大求最小,想到二分答案,还要排序,加个全排列 解法:很好,作者思路全错了,这垃圾题目 ,先找数学规律,再加高精度
#include<bits/stdc++.h>
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 <bits/stdc++.h>
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<bits/stdc++.h>
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;
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 得分: 订正代码
在这里插入代码片
|