A. PizzaForces
题意:
给定3个数,和其对应的花费
6 花费 15
8 花费 20
10 花费 25
然后给定一个n,求上面的数凑成一个 >= n的数的最小花费
思路:
对比上面的花费,可以发现,2的花费是5
那么
n为奇数花费需要 (n + 1) /2 *5
n为偶数花费需要 n / 2 * 5
当n < 6的时候,至少要花费15
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long n;
cin>>n;
long long res=0;
if(n&1) res=(n+1)/2*5;
else res=n/2*5;
if(res<15) res=15;
cout<<res<<endl;
}
return 0;
}
C. Coin Rows
题意:
给定一个 2 * m 的矩阵,矩阵中每个格子有一个数
现在有2个人从 (1,1) 走到 (2,n)
1.首先第一个先走,然后第二个人走,走过一个格子的时候,取走里面的数
2.每个人只能向右和向下走
3.最后的结果是第二个人,取走的数的和
4.第一个人走的时候,希望结果尽可能少
第二个人走的时候,希望结果尽可能大
思路:
由于是 2 * m的矩阵,所以一个人能走的路线只有n种,每种路线取决于在第一行的那个元素向下走一次
所以可以枚举第一个人能走的所有路线
在这里使用前缀和来求这条路线取走的数的和
处理一个第一行的前缀和数组a[ i ]
第二行的前缀和数组 b[ i ]
假设是从第i个元素向下走的,那么
第二个人能取的元素和就是
a[m] - a[i] 或者 b[i - 1]
因为他要最大,所以 max(a[m] - a[i],b[i - 1])
因为第一个人先走,所以他会选择走使第二个人取得数最少的一条路
所以 res = min(res,max(a[m] - a[i],b[i - 1]))
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N],b[N];
int main()
{
int t;
cin >> t;
while(t --)
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i];
for(int i = 1;i <= n;i ++) cin >> b[i];
// a[1] = b[n] = 0;
for(int i = 1;i <= n;i ++)
{
a[i] += a[i - 1];
b[i] += b[i - 1];
}
int res = 0x3f3f3f3f;
for(int i = 1;i <= n;i ++) res = min(res,max(a[n] - a[i] , b[i - 1]));
cout << res << endl;
}
return 0;
}
D. Say No to Palindromes
题意:
给定一个只包含(a,b,c)的字符串,每次询问一个区间,问把这个区间的字符串变成任何长度 > 1 的 子字符串都不是回文的最少操作次数
更改一个字符为(a,b,c)算一次操作
思路:
当一个字符串有 长度 > 1的子字符串是回文的时候
只有改成abc,acb,bac,bca,cab,cba由其中一个的循环节组成的时候,才不会有回文
所以枚举一下,看变成那个字符串循环节的时候,操作次数最少
因为每次查询的是一个区间
由于操作次数的特性,所以可以使用前缀和思想
预处理出f[i,j]表示前j个字符变成第i个字符串循环节组成的次数
#include <iostream>
#include <string>
using namespace std;
string s[6] ={"abc","acb","bac","bca","cab","cba"};
const int N = 2e5 + 10;
int f[6][N];
char t[N];
int main()
{
int n,m;
cin >> n >> m >> (t + 1);
for(int i = 0;i < 6;i ++)
for(int j = 1; j <= n;j ++)
{
if(t[j] != s[i][j % 3]) f[i][j] = 1;
f[i][j] += f[i][j - 1];
}
while(m --)
{
int l,r;
cin >> l >> r;
int res = 0x3f3f3f3f;
for(int i = 0;i < 6;i ++) res = min(res,f[i][r] - f[i][l - 1]);
cout << res << endl;
}
return 0;
}