打cf的过程中遭受到了DDOS攻击,导致最终无法进行下去,也算是奇闻一件了
思路:看似像个火柴游戏,实则只是个判断奇偶的水题
/*
Author Owen_Q
*/
#include
using namespace std;
typedef long long ll;
const int maxn = 1e7+5;
int a[maxn];
int main()
{
int n,q;
//freopen(".txt","r",stdin);
//ios::sync_with_stdio(false);
//cin.tie(0);
scanf("%d",&q);
while(q--)
{
scanf("%d",&n);
if(n==2)
printf("%d\n",2);
else
{
if(n%2==0)
printf("%d\n",0);
else
printf("%d\n",1);
}
}
return 0;
}
思路:看似是个字符串匹配题,实则只是检测两串中是否有相同字母的水题
/*
Author Owen_Q
*/
#include
using namespace std;
typedef long long ll;
const int maxn = 115;
char s[maxn],t[maxn];
bool num1[26];
bool num2[26];
int num[26];
int main()
{
int q;
//freopen(".txt","r",stdin);
//ios::sync_with_stdio(false);
//cin.tie(0);
scanf("%d",&q);
while(q--)
{
memset(num,0,sizeof num);
memset(num1,false,sizeof num1);
memset(num2,false,sizeof num2);
scanf("%s",s);
scanf("%s",t);
int len = strlen(s);
for(int i=0;i
思路:第三题的出现,避免了让本场成为手速场,细思之,这题还是蛮不错的
有n张不同票价的影票,按任意顺序出售,现需将位于a倍数的电影票和b倍数的电影票按一定折扣售出,求达到一定销售额最少所需出售的票数。
如果是为了将所有票售出,那么将高额电影票分配到高价格的位置即为最优策略,但由于为了使售出票数最少,即需要将位于后面的高额电影票移至前方。于是一开始考虑到的当然是移动策略。不过模拟整个移动过程变得极其复杂。突然想到最优策略完全可以用于判断在一定票数内能否达到营业额,然后利用二分的思路逼近最终答案。
想到这里,一切浮出水面,策略就相对简单了,分类讨论
1.若a、b位置相同,二分都不需要了,只有一种票价,直接卖就好了
2.若a、b位置不同,那么当然现卖a、b重合的位置了,(一定要注意:a、b重合的位置不为a*b,二是lcm(a,b)=a*b/gcd(a,b)
2.1若a、b有重合的位置,则先将高额票放这些位置出售
2.2出售完(或者没有)重合位置的票后,再依次出售a、b位置中的高价票,若两票价相同,则按顺序出售即可
/*
Author Owen_Q
*/
#include
using namespace std;
typedef long long ll;
const int maxn = 2e5+5;
int p[maxn];
int a,b,x,y;
ll k;
bool check(int n)
{
//int pp[maxn];
ll sum = 0;
int now,pos=0;
if(ll(a) * ll(b) / ll(__gcd(a,b))<=ll(n))
{
int lcm = a / __gcd(a,b) * b;
for(now=lcm;now<=n;now+=lcm)
{
sum += ll(p[pos++]/100*(x+y));
//cout << sum << "#" << endl;
if(sum>=k)
break;
//cout << pp[now] << "*" << endl;
//cout << sum <0&&(now%a==0||now%b==0))
sum +=ll(p[pos++]/100*x);
//cout << sum <=k)
break;
}
}
else
{
if(x0)
{
sum += ll(p[pos++]/100*x);
if(sum>=k)
break;
}
//cout << sum <0)
{
sum += ll(p[pos++]/100*y);
if(sum>=k)
break;
}
//cout << sum <=k)
break;
}
}
}
else
{
if(x=k)
break;
}
for(now=b;now<=n;now+=b)
{
sum += ll(p[pos++]/100*y);
if(sum>=k)
break;
}
}
}
if(sum>=k)
return true;
else
return false;
}
int main()
{
int q;
//freopen("in.txt","r",stdin);
//ios::sync_with_stdio(false);
//cin.tie(0);
scanf("%d",&q);
while(q--)
{
int n;
scanf("%d",&n);
for(int i=0;iC. Save the Nature());
scanf("%d%d%d%d",&x,&a,&y,&b);
scanf("%I64d",&k);
if(a==b)
{
ll sum = 0;
int now,pos;
for(now=a,pos=0;now<=n;now+=a,pos++)
{
sum+=ll(p[pos]/100*(x+y));
//cout << sum <=k)
break;
}
if(now<=n)
printf("%d\n",now);
else
printf("%d\n",-1);
}
else
{
int st = 1, en = n;
//cout << st << "*" << en << "*" << check(n) << endl;
if(!check(n))
printf("-1\n");
else
{
while(st