题意: 给出一个n,k 。问n能不能被分解成k个奇数和,要求奇数唯一
分析: 既然要分解k个奇数和,那么k为偶数,那么n必定是偶数,k为奇数,那么n必定是奇数。然后我们还需要考虑,是不是够分解,如果n很小,那么也是不满足的,例如 5,5 。由于奇数唯一,那么一定是1 3 5 7 9 …
所以我们对于一个等差数列求和即可。然后只要sum<=n就满足条件。
注意 求和的时候开long long
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n,k;
scanf("%lld%lld",&n,&k);
if((k%2==1&&n%2==1)||(k%2==0&&n%2==0)) //判断奇偶性
{
ll sum=k+k*(k-1);//等差数列求和
if(sum<=n)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
else
{
printf("NO\n");
}
}
return 0;
}
题意: 公主嫁给王子,每个公主有个单子,上面写了喜欢哪一位王子,
然后,公主嫁人的时候,优先选择最小的数量的王国的王子,也就是说先选单子上数值最小的。题目保证,单子是按照递增排列的。题目要问,是不是存在一种优化方式,可以使得结婚对数增加。如果有增加,输出几号单子和增加哪一位王子编号。
分析: 由于题目说明了单子是按照递增排列,我们每次选择当前序列的最小那个,如果之前被选过了,我们就continue,如果一个单子一个都没被选,我们标记下这个位置。结束的时候看看还有没有王子没被选,如果还存在王子没被选,那么就把这个王子放到刚刚标记的那个位置上。这是优化的情况。如果全是一对一结婚了,那么就不用优化了。
这题就是阅读理解,读懂了就做出来了。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int t;
int n;
int k;
int x;
int vis[N];
int main()
{
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
int ans1=0;
int ans2=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&k);
int f=0;
for(int j=0;j<k;j++)
{
scanf("%d",&x);
if(vis[x]==0&&f==0)
{//找到一个最小值,那么下面都不需要了,f就是来控制这个的
vis[x]=1;
f=1;
}
}
if(f==0)
{//f==0说明这清单没有最小值了,或者全被标记了
ans1=i+1;
}
}
if(ans1==0)
{
printf("OPTIMAL\n");
}
else
{
printf("IMPROVE\n");
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
ans2=i;
break;
}
}
printf("%d %d\n",ans1,ans2);
}
}
return 0;
}
题意:给出起点和终点,能上下左右移动,遇到墙的边缘,不可穿墙,如果穿墙,则原地不动。问一个序列,能使所有起始点都能跑完终点
分析: 由于题目说不是最优解,所以我们可以最贪心的方式。先把所有点移到左上角,然后S型跑全图即可。这样保证每个点都被经过。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=205;
int n,m,k;
int l,r;
int main()
{
string ans="";
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)ans+="U";
for(int i=0;i<m;i++)ans+="L";
for(int i=0;i<k;i++)
{
scanf("%d%d",&l,&r);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
if(i%2==1)ans+="R";
else ans+="L";
}
if(i<n)
{
ans+="D";
}
}
cout<<ans.length()<<endl;
cout<<ans<<endl;
return 0;
}
题意:给出一个n,求 0 to 10^(n−1) 假设n是2,那么求0-99 2位数的块
块的定义:一个数字,连续相同算一块。例如111222333=3块,此题要注意的是,如果不足n位,需要补充前置0
分析: 打表,找规律
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+100;
const ll MOD=998244353;
ll a[N];
ll n;
ll quick_pow(ll x,ll c)
{
ll base=x;
ll ans=1;
while(c>0)
{
if(c&1)
{
ans*=base;
ans%=MOD;
}
base*=base;
base%=MOD;
c>>=1;
}
return ans%MOD;
}
void solve(ll n)
{
//1 18 261 3420 43200 504000 5850000 66600000
a[1]=1;
a[2]=18;
a[3]=261;
for(ll i=4;i<=n;i++)
{
a[i]=(1ll*81%MOD*(i-1)+99*1ll)%MOD*quick_pow((ll)10,(ll)i-3)%MOD; //规律
a[i]%=MOD;
}
}
int main()
{
scanf("%lld",&n);
solve(n);
for(int i=n;i>=1;i--)
{
a[i]%=MOD;
printf("%lld ",a[i]%MOD*10%MOD);
}
return 0;
}