打cf的過程中遭受到了DDOS攻擊,導致最終無法進行下去,也算是奇聞一件了
A. CME
思路:看似像個火柴遊戲,實則只是個判斷奇偶的水題
/*
Author Owen_Q
*/
#include <bits/stdc++.h>
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;
}
B. Strings Equalization
思路:看似是個字符串匹配題,實則只是檢測兩串中是否有相同字母的水題
/*
Author Owen_Q
*/
#include <bits/stdc++.h>
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<len;i++)
{
num1[s[i]-'a']=true;
num2[t[i]-'a']=true;
}
for(int i=0;i<26;i++)
num[i] = num1[i] + num2[i];
sort(num,num+26);
//cout << num[0] << "*" << num[25] << endl;
if(num[25]==2)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
C. Save the Nature
思路:第三題的出現,避免了讓本場成爲手速場,細思之,這題還是蠻不錯的
有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 <bits/stdc++.h>
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 <<endl;
}
if(x==y)
{
for(now=1;now<=n;now++)
{
if(now%lcm>0&&(now%a==0||now%b==0))
sum +=ll(p[pos++]/100*x);
//cout << sum <<endl;
if(sum>=k)
break;
}
}
else
{
if(x<y)
{
swap(x,y);
swap(a,b);
}
for(now=a;now<=n;now+=a)
{
if(now%lcm>0)
{
sum += ll(p[pos++]/100*x);
if(sum>=k)
break;
}
//cout << sum <<endl;
}
for(now=b;now<=n;now+=b)
{
if(now%lcm>0)
{
sum += ll(p[pos++]/100*y);
if(sum>=k)
break;
}
//cout << sum <<endl;
}
}
}
else
{
if(x==y)
{
for(now=1;now<=n;now++)
{
if(now%a==0||now%b==0)
{
sum += ll(p[pos++]/100*x);
//cout << sum <<endl;
if(sum>=k)
break;
}
}
}
else
{
if(x<y)
{
swap(x,y);
swap(a,b);
}
for(now=a;now<=n;now+=a)
{
sum += ll(p[pos++]/100*x);
if(sum>=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<n;i++) scanf("%d",&p[i]);
sort(p,p+n,greater<int>());
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 <<endl;
if(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<en)
{
int mid = (st + en)/2;
//cout << now << "*" << mid << "*" << st << "*" << en<< endl;
if(check(mid))
en = mid;
else
st = mid+1;
//cout << st << "*" << en << "*" << check(mid) << endl;
}
printf("%d\n",st);
}
}
}
return 0;
}
/*
分類討論過於複雜,考慮二分
*/
/*
細節
*/
/*
利用gcd判斷是否爲同時爲兩個數的倍數(lcm = a*b/gcd)
*/