传送门
A.Silent Classroom
水题。
#include
using namespace std;
#define ll long long
mapmp;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
mp[s[0]]++;
}
ll ans=0;
for(char i='a';i<='z';i++)
{
if(mp[i]>1)
{
if(mp[i]%2)
{
// cout<
B. All the Vowels Please
满足行列都大于5就行了,后面乱构造一下就好了。
#include
using namespace std;
#define ll long long
string s[10];
int main()
{
int k;
cin>>k;
s[1]="aeiou";
s[2]="uaeio";
s[3]="ouaei";
s[4]="iouae";
s[5]="eioua";
s[6]="aaaaa";
if(k<25)
{
cout<<-1<
C. A Tale of Two Lands
对于|x|,|y|来说,x,y的正负并不会产生什么影响;对于|x−y|,|x+y|来说,x,y的正负也不会产生什么影响。所以我们就可以直接对ai取绝对值,只看为正数的情况就好了。只需要关注x-y的值是否大于当前值就行 然后尺取法就可以搞定 然后注意因为可能书太大 所以需要用long long
#include
#include
#include
#include
#include
#include
D
题意:给一个序列的首项与末项a,b,现在要求我们怎么可以使得这个序列中的每个数,其中1≤ri≤m。如果可行的话,请输出一种解。
思路:
因为每个r最少为1,所以我们先令所有的r=1,得到一个序列:a, a+1, 2∗a+2, 4∗a+4,...
我们发现i>=3,i>=3时,第i项是i+1项的二倍。所以这个序列增长很快!
我们求只取这个序列中小于等于b的部分,那么我们得到一个序列A,长度为k (A为构造的序列)。
我们令rem=b−A[k], 那么rem就是我们需要往这个序列中增加某些位置的r值,让rem减少到0,从而让A[k]等于b
我们假设第i位的r增加1,那数组A中第i+1位的值增加1,第i+2位的值增加2第i+3位的值增加4,向后的第q位的值增加,那么我们可以算出来对数组A第k位的值增加多少。换句话说对rem减少的贡献是多少。
所以我们可以贪心的从第2位一直到第k位,假设此时考虑第i位, r增加1对rem的贡献减少val,那么我们就让第 i 位的 r增加y=min(m−1,rem/val).
注意,当i=k的时候,对第rem减少的贡献也是1。
如果最后rem为0,那么咱们构造的数组A就是解。
否则一定无解。
#include
#define ll long long
using namespace std;
ll arr[1010];
ll r[1010];
ll rem;
ll check(ll ans,ll t)
{
if(t==1)
return ans+1;
else
return 2ll*ans;
}
ll getval(ll t)//算出来第i位增加1,对rem的贡献是多少
{
if(t<=2)
return 1;
t-=2;
return (1ll<>t;
while(t--)
{
ll a,b,m;
cin>>a>>b>>m;
ll tot=0;
arr[++tot]=a;
while(check(arr[tot],tot)<=b)//处理得到初始的A数组
{
arr[tot+1]=check(arr[tot],tot);
tot++;
}
for(ll i=2;i<=tot;i++)
r[i]=1ll;
rem=b-arr[tot];
if(!solve(tot,m))//处理rem
{
cout<<-1<
E
题解
#include
using namespace std;
int vis[55][10100];
int main()
{
int m,n;
cin>>m>>n;
for(int i=1;i<=m;i++)
{
int t;
cin>>t;
for(int j=0;j>x;
vis[i][x]=1;
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
if(i==j)
continue;
int flag=0;
for(int k=1;k<=n;k++)
if(vis[i][k]&&vis[j][k])
{
flag=1;
}
if(flag==0){
cout<<"impossible"<