目录
A题目在这里
每一片Pizza花费2.5分钟,所以尽可能地让 n 被分割且不剩余就可以,当 时,必须做一块小披萨,花费 分钟,当 且 为 偶数 时,必然可以 被分割 且不剩余,下面证明一下,想要让这个成立 ,则必须有
先假设其成立,则
所以对于任意的 的偶数 总可以 被6,8,10不剩余的分割。
那么奇数呢,很简单,让 变成偶数就好
所以当时
当 时:
当为偶数时:
当为奇数时:
代码
#include<bits/stdc++.h>
using namespace std;
void solve(){
long long n;
cin>>n;
long long ans;
if (n<6)
ans=15;
else{
if (n&1)
ans=(n+1)*2.5;
else
ans=n*2.5;
}
cout<<ans<<endl;
}
int main(){
int t;
cin>>t;
while (t--)
{
solve();
}
return 0;
}
B题目在这里
C题目在这里
Alice想让分数最小化。Bob想让分数最大化。如果双方都以最佳状态比赛,游戏的分数会是多少?
每次都是Alice先走,所以Bob只能被动选择最优路线。首先,Alice的路径只有m个选项--从哪一列下去。Alice走完以后,Bob要么在第一列下去,要么在第二列下去,他的最优路径将是这两个选项中的一个。
预先处理前缀和,每次Alice选择完路径后,可确定Bob的最大分数,进而迭代Alice需要的最小分数
以举例
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
定义数组
const int MAXN=10005;
int a[MAXN];//第一列
int b[MAXN];//第二列
int suma[MAXN];//第一列前缀和
int sumb[MAXN];//第二列前缀和
suma[0]=0;
sumb[0]=0;
当Alice从第 1 列下去
Bob 的 分数为:max(suma[12]-suma[1] , sumb[0])(已经让sumb[0]=0)
当Alice从第 2 列下去
Bob 的 分数为:max(suma[12]-suma[2] , sumb[1])
当Alice从第 3 列下去
Bob 的 分数为:max(suma[12]-suma[3] , sumb[2])
...
当Alice从第 i 列下去
Bob 的 分数为:max(suma[12]-suma[i] , sumb[i-1])
所以每次得出Bob的分数后,和 ans 取min(),就是最后的答案
代码
#include<bits/stdc++.h>
using namespace std;
void solve(){
int a[100005],b[100005],suma[100005],sumb[100005];
int m,ans=1e9+5;
cin>>m;
for(int i=1;i<=m;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
suma[0]=0;
sumb[0]=0;
suma[1]=a[1];
sumb[1]=b[1];
for(int i=2;i<=m;i++)suma[i]=suma[i-1]+a[i];
for(int i=2;i<=m;i++)sumb[i]=sumb[i-1]+b[i];
for (int i=1;i<=m;i++){
ans=min(ans,max(suma[m]-suma[i],sumb[i-1]));
}
cout<<ans<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}