比完后等到12点成功一发呼符艾蕾get o( ̄▽ ̄)ブ(卡池刚开时70多石头都没出货…
A - Partition CodeForces - 946A
题意:给你一堆数,将其分成两部分,两部分分别求和再相减,使得差最大,求最大差。
题解:非负数直接加,负数直接减,直接得到答案。
B - A/B HDU - 1576
题意:要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
题解:数论问题,设A=k *9973+n,A/B=q *9973+x,得到(x *B)%9973=n,我们枚举0到9972的x值,即可得到最终答案。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long b,n;
scanf("%lld%lld",&n,&b);
for(long long i=0;i<=9972;i++)
{
if((b*i)%9973==n)
{
printf("%lld\n",i);
break;
}
}
}
}
C - Rightmost Digit HDU - 1061
题意:给你一个正整数n,求n^n的最右边的数字为几。
题解:找规律,我是一个一个找的,真的恶心到了。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
long long x;
scanf("%lld",&x);
long long now=x%10;
if(now==0||now==1||now==5||now==6||now==9)
{
printf("%lld\n",now);
}
if(now==2)
{
if(x%4==0)
{
printf("6\n");
}
else
{
printf("4\n");
}
}
if(now==3)
{
if(x%4==1)
{
printf("3\n");
}
else
{
printf("7\n");
}
}
if(now==4)
{
printf("6\n");
}
if(now==7)
{
if(x%4==1)
{
printf("7\n");
}
else
{
printf("3\n");
}
}
if(now==8)
{
if(x%4==0)
{
printf("6\n");
}
else
{
printf("4\n");
}
}
}
}
return 0;
}
D - Tempter of the Bone HDU - 1010
题意:给你一个n*m的地图和一个时间t,问能否再第t秒正好到达出口。
题解:dfs+剪枝。这个奇偶剪枝真的惊到我了,起点和终点距离与时间必须奇偶性相同,否则直接可以砍掉。
E - Pie HDU - 1969
题意:有n个派和k个朋友,你要切出k+1块等大的派来分给每个朋友和自己,问每人最大可以分到的派有多大(派只能切,不可以拼)。
题解:二分。这个题一开始没看懂题意,怎么也过不了样例,果然英语能力太差了。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double a[10005];
const double pi=acos(-1.0);
int n,f;
bool check(double mid)
{
int total=0;
for(int i=1;i<=n;i++)
{
total+=int(a[i]/mid);
}
if(total>=f+1) return 1;
else return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&f);
double l=0,r=0;
for(int i=1;i<=n;i++)
{
scanf("%lf",&a[i]);
a[i]=a[i]*a[i]*pi;
r+=a[i];
}
double ans=0;
while(r-l>0.00001)
{
double mid=(l+r)/2;
if(check(mid))
{
l=mid;
ans=max(ans,l);
}
else
{
r=mid;
}
}
printf("%.4lf\n",ans);
}
return 0;
}
G - What Are You Talking About HDU - 1075
题意:给你个单词一一对应的词典,让你翻译句子。
题解:map模拟。这题我疯狂RE也不知道咋回事,后来直接重新写了。
不过知道了m.find()函数来判断map中有没有某个元素。
H - 水果 HDU - 1263
题解:用的set模拟。
I - 最大连续子序列 HDU - 1231
题意:给你一个序列,找出和最大的连续子序列,输出最大和、连续子序列的第一个元素、最后一个元素,如果整个序列都为负数则输出0 、序列第一个元素、最后一个元素。
题解:显然最大连续子序列的第一个元素一定为非负数,我求了个前缀和,然后每找到一个非负数就开始往后找右边界,O(1)比较。
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int a[10005];
int sum[10005];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;i++)
{
sum[i]=0;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
int l=0,r=0;
int ans=-1;
for(int i=1;i<=n;i++)
{
if(a[i]>=0)
{
for(int j=i;j<=n;j++)
{
if(sum[j]-sum[i-1]>ans)
{
ans=sum[j]-sum[i-1];
l=i,r=j;
}
}
}
}
if(l==0&&r==0)
{
printf("0 %d %d\n",a[1],a[n]);
}
else
{
printf("%d %d %d\n",ans,a[l],a[r]);
}
}
return 0;
}
J - Unimodal Array CodeForces - 831A
题意:给你一个序列,问你这个序列是否满足(1)开始严格上升,(2)后来不变,(3)再严格下降的特点。(1)和(3)条件可以不存在其中一个,也可以都不存在。
题解:题解即题面,没啥好说的,注意细节。附上渣渣代码,写的我都快不知道我想干啥了。
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int a[105];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
bool flag=1;
int pd=0;
int now=1;
while(now<=n)
{
now++;
if(a[now]==a[now-1])
{
if(pd==0)
pd=a[now];
else if(a[now]!=pd)
flag=0;
}
if(pd!=0&&a[now]>a[now-1])
{
flag=0;
}
if(a[now]<a[now-1])
{
break;
}
}
while(now<=n)
{
now++;
if(a[now]>=a[now-1])
{
flag=0;
break;
}
}
if(flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}