1.A-Onewan的疑惑

这道题,重要的是读懂题目,然后把这个式子进行合理转化,在题目要求中读取信息为:
- x为小于等于n的正整数
- (把19260817移到不等号的右边,左边只剩x,右边我进行了人工计算,得到)
- x>=n-19375331
所以,我只要找到满足这两条条件的x的个数即可
又因为n的数量级是10的9次方,而long long int的数量级是正负2的63次方-1。所以我们可以使用long long int这个数据类型进行存储数据。
如果使用for循环挨着找的话,时间复杂度太高了所以过不了。
for(int i=1,i<=n;i++)
{
if(i>=n-19375331)
{
count++;
}
}
所以我就从数学角度简化做法,我们把n-19375331用x来定义,我发现如果x是一个小于等于0的数,那么本题就转化为了有多少个正整数小于等于n,大于等于x(一个非正数)。很显然有n个。否则的话,就是n-x+1个,如果搞不清楚加不加1,看看测试用例就行了。
#include <stdio.h>
int main()
{
long long int n=0,i,x;
scanf("%lld",&n);
x=n-19375331;
if(x<=0)
{
printf("%lld",n);
}
else
{
printf("%lld",n-x+1);
}
return 0;
}
2.菲菲姐的游戏

- 易错点:(1)是第一个人在分这个数组,所以对他最有利的分发一定是给自己的数组中所包含的数越多越好,因此我们确定分数组的方法为n-1:1;(2)"至多"为k1和k2,说明了最优策略为平均数找n-1中的最大值,中位数为最后给他剩的那一个数;(3)注意:划分也是属于最优策略的一部分;那么以上就是我们的划分部分(4)至于判断是否存在必胜策略,那只要最后一个数不是最大的话,那“我”一定赢。
-
#include <stdio.h> int main() { int n,k1,k2,i,flag=0; int a[10002]; scanf("%d%d%d",&n,&k1,&k2); for(i=0;i<n;i++) { scanf("%d",&a[i]); } int temp=a[0]; int index = 0; for(i=1;i<n;i++) { if(a[i]>temp) { temp=a[i]; index = i; } } if(index == n-1)//说明没有必胜策略 printf("No\n"); else //说明我一定会赢 printf("Yes\n"); return 0; }思路就是这个思路,但是还是没有通过,所以通过了我再修改
1104

被折叠的 条评论
为什么被折叠?



