A.Sum of Odd Integers
题意:给你 n 和 k ,问你 n 能否由 k 个不同的奇数组成
首先只有 k 和 n 的奇偶性相同才有可能,其次 k 个奇数最小能组成的数必须小于等于 n ,即 k*k<=n 才可以
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int T;
cin>>T;
while(T--)
{
ll n,k;
scanf("%lld%lld",&n,&k);
if((n%2&&k%2)||(n%2==0&&k%2==0))
{
if(n>=k*k)
printf("YES
");
else
printf("NO
");
}
else
{
printf("NO
");
}
}
return 0;
}
B.Princesses and Princes
这题也太长了吧TnT
题意:给你个数字 n,然后给你 n 个区间,对于每个区间,你要选择该区间中没有被选择过的最小的数,如果到最后你选择的数不足 n 个,你可以让任意一个没有选择过数的区间选择任意一个没被选择的数(先打印 IMPROVE ),否则打印 OPTIMAL
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100005],v[100005];
int main()
{
int T;
cin>>T;
while(T--)
{
int n,x,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int j,k,flag=0,t;
scanf("%d",&k);
for( j=1;j<=k;j++)
{
scanf("%d",&t);
if(!v[t]&&!flag)
{
v[t]=1;
flag=1;
ans++;
}
}
if(flag==0)//没有选过数,把这个区间记下来
x=i;
}
if(ans==n)
printf("OPTIMAL
");
else
{
printf("IMPROVE
");
printf("%d ",x);
for(int i=1;i<=n;i++)
{
if(!v[i])
{printf("%d
",i);
break;
}
}
}
memset(v,0,sizeof(v));
}
return 0;
}
C.Game with Chips
题意:在一个 N*M 的矩阵中,给你 k 个起始点和 k 个目标点,你可以进行移动操作,每次可以让所有起始点向同一个方向移动一格,要让每个点至少走一遍它对应的目标点,总移动次数不超过 2*N*M 次。
直接先把所有点都聚集到左上方(该操作肯定不超过 N*M 次),再直接从左上角跑到右下角,把整张图跑一遍(该操作肯定不超过 N*M 次),总共移动次数不超过 2*N*M 次
#include<bits/stdc++.h>
using namespace std;
struct p
{
int x,y;
} v[250];
struct m
{
int x,y;
} c[250];
char step[100000005];
int main()
{
int n,m,k,cot=1,maxx=-1,maxy=-1;
cin>>n>>m>>k;
for(int i=1; i<=k; i++)
{
scanf("%d%d",&v[i].x,&v[i].y);
maxx=max(v[i].x,maxx);
maxy=max(v[i].y,maxy);
}
for(int i=1; i<=k; i++)
{
scanf("%d%d",&c[i].x,&c[i].y);
}
for(int i=1; i<maxx; i++)
{
step[cot++]='U';
}
for(int j=1; j<maxy; j++)
{
step[cot++]='L';
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<m; j++)
{
if(i%2)
step[cot++]='R';
else
step[cot++]='L';
}
if(i!=n)
step[cot++]='D';
}
printf("%d
",cot-1);
for(int i=1; i<=cot-1; i++)
printf("%c",step[i]);
return 0;
}