您的位置:首页 > 其它

SDUT 2017 Autumn Single Contest K

2017-12-06 11:01 399 查看
题目链接

A:贪心

题意:一只蜈蚣有40条左腿和40条右腿。它有a只左鞋和b只右鞋。穿一只左鞋2s,穿一只右鞋1s,扔鞋1s。问给所有脚都穿上鞋最坏需要多长时间。

解析:贪心一下,看什么情况下会花最长的时间。无非两种情况下时间最长:

1、先拿所有右鞋去试左脚,再穿左脚:2*b + 40;

2、先给39只右脚穿上鞋,再给所有的左脚穿上鞋,然后再把所有的剩下的左鞋去试右脚,然后再穿上右鞋:39 * 2 + 40 + 2 *(a - 40)+ 1;

#include<iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int c = 40+b*2;
int d = 2*a+39;
cout<<max(c,d)<<endl;

}


B Fibonacci Sequence

二分枚举斐波那契的下一项

注意二分的姿势,用题目给出的第二项验证,然后递推求出要求的项

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll i,fi,j,fj,n;
while(cin>>i>>fi>>j>>fj>>n)
{
if(i>j)
{
swap(i,j);
swap(fi,fj);
}
ll l,r,mid,a,b,c;
l = -2000000000LL,r = 2000000000LL;
while(l<r)
{
mid = (l+r)/2;
a = fi;
b = mid;
for(int k=i+2; k<=j; k++)
{
c = a+b;
a = b;
b = c;
if(c>4000000001LL||c<-4000000001LL)
{
break;
}
}
if(b<fj)
{
l  = mid+1;
}
else if(b>fj)r = mid-1;
else { l =mid,r = mid;}
}
a = fi;
b = r;
if(n>=i+1)
{
for(int k=i+2;k<=n;k++)
{
c = a+b;
a = b;
b = c;
}
printf("%lld\n",b);
}
else
{
for(int k=i-1;k>=n;k--)
{
c = b-a;
b = a;
a = c;
}
printf("%lld\n",a);
}

}
return 0;
}


E:URAL 2067 Friends and Berries (推理,数学)

题意:给定 n 个人,每个人两个值s, r,要满足,p(v, u) = sqrt((sv − su)^2 + (rv − ru)^2), p(v,u,w) = (p(v,u) + p(v,w) + p(u,w)) / 2

要求找出p(v, u) ≥ p(v,u,w) 的对数,其中w是除u,v外,任意的人。

析:化简一下这个表达式,这很明显是两边之和小于等于第三边,好像挺熟悉啊,对,三角形是两边之和大于第三边,现在是小于,不可能,只能是等于,要想等于,

那么只是共线了,并且w是任何人,所以这些点全部都要共线。并且两端的人就是答案,并且只有一对。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define double long long
struct node
{
long long x,y,i;
} aa[266666];
int cmp(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
else
return a.x<b.x;
}
int main()
{

int n;
cin>>n;

for(int i=1; i<=n; i++)
{
scanf("%lld%lld",&aa[i].x,&aa[i].y);
aa[i].i = i;
}
sort(aa+1,aa+1+n,cmp);
long long x1 = aa[2].x-aa[1].x;
long long y1 = aa[2].y-aa[1].y;
int f =1;
for(int j=3; j<=n; j++)
{
long long x2 = aa[j].x-aa[1].x;
long long y2 = aa[j].y-aa[1].y;
if(x1*y2!=x2*y1)
{
f =0 ;
break;
}

}
if(f)
{
cout<<"1"<<endl;
printf("%lld %lld\n",aa[1].i,aa
.i);
}
else
cout<<"0"<<endl;

return 0;
}


G dfs可以跑出所有结果,很容易发现规律

不能包含回文串,所以aa,aba这样的串最后答案都不能包含。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
char ans[][10]={"abc","acb","bac","bca","cab","cba"};
int main()
{

int n;
cin>>n;
if(n==1)
{
cout<<"a\nb\nc\n";
}
else if(n*6>100000)
{
cout<<"TOO LONG"<<endl;
}
else
{
for(int i=0;i<6;i++)
{
for(int j=0;j<n;j++)
{
printf("%c",ans[i][j%3]);
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: