A. Drinks Choosing
一开始卡在题意上,一开始以为是买多少,后来发现是买的能让多少人喝
#include
#define int long long
using namespace std;
const int maxn = 1010;
int vis[maxn];
signed main()
{
ios::sync_with_stdio(false);
int n,k,tmp;
cin >> n >> k;
for(int i = 1;i <= n; ++i)
{
cin >> tmp;
vis[tmp]++;
}
tmp = 0;
for(int i = 1;i <= k; ++i)
tmp += vis[i] / 2;
cout << (n+1)/2-tmp+tmp*2 << endl;
return 0;
}
B. Sport Mafia
因为放进去的个数是累加的,而且如果有糖的时候先放和先吃没有区别,找到规律就可以了
#include
#define int long long
using namespace std;
signed main()
{
ios::sync_with_stdio(false);
int n,k,sum = 0,i;
cin >> n >> k;
for(i = 1;sum - (n - i + 1) < k; ++i)
sum += i;
cout << n - i + 1 << endl;
return 0;
}
C. Basketball Exercise
从左到右每一列三种情况,取第一行的人,取第二行的人,和第一行第二行的人都不取。
#include
#define int long long
using namespace std;
const int maxn = 1e5+10;
int a[maxn],b[maxn],dp[maxn][5];
signed main()
{
ios::sync_with_stdio(false);
int n,k,sum = 0,i;
cin >> n;
for(int i = 1;i <= n; i++)
cin >> a[i];
for(int i = 1;i <= n; i++)
cin >> b[i];
for(int i = 1;i <= n; i++)
{
dp[i][0] = max(max(dp[i-1][0],dp[i-1][1]),dp[i-1][2]);
dp[i][1] = max(dp[i-1][0],dp[i-1][2]) + a[i];
dp[i][2] = max(dp[i-1][0],dp[i-1][1]) + b[i];
}
cout << max(dp[n][0],max(dp[n][1],dp[n][2])) << endl;
return 0;
}
D1. Submarine in the Rybinsk Sea (easy edition)
考虑每个数字中每个数位的贡献,然后累加起来求和
#include
#define int long long
using namespace std;
const int mod = 998244353;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,mp,ans = 0;
cin >> n;
for(int i = 0;i < n; i++)
{
cin >> mp;
int xx = 0,pos = 1;
while(mp)
{
xx = (xx + (((mp % 10) * pos) % mod) * 11) % mod;
pos *= 1ll*100;
mp /= 10;
}
xx = (xx * n) % mod;
ans = (ans + xx) % mod;
}
cout << ans << endl;
return 0;
}
D2. Submarine in the Rybinsk Sea (hard edition)
题意和上一题是一样的,但是上一题中给出的数字都是等长的,贡献值就比较好算,这个题不等长就有点儿问题
#include
#define int long long
using namespace std;
const int mod = 998244353;
const int maxn = 1e5+10;
int cnt[15],x[maxn][15],sum;
void Cal(int tmp,int base,int y)
{
while(tmp)
{
sum += base * (tmp % 10) % mod;
sum %= mod;
if(y > 0)
base *= 100*1ll;
else
base *= 10*1ll;
base %= mod;
tmp /= 10;
y--;
}
}
signed main()
{
//freopen("in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(0);
int n,xx;
cin >> n;
for(int i = 1;i <= n; i++)
{
cin >> xx;
int tmp = 0,y = xx;
while(y)
{
tmp++;
y /= 10;
}
x[cnt[tmp]++][tmp] = xx;
}
int ans = 0;
for(int i = 1;i <= 10; i++)
{
for(int j = 1;j <= 10; j++)
{
for(int k = 0;k < cnt[i]; k++)
{
if(cnt[j] == 0)
continue;
sum = 0;
Cal(x[k][i],1,j);
Cal(x[k][i],10,j-1);
sum = (sum * cnt[j]) % mod;
ans = (ans + sum) % mod;
}
}
}
cout << ans << endl;
return 0;
}