Problem - 1883C - Codeforces
这题当时想复杂了。
题目大意:
给一串数组和一个数字k,求对数组进行多少次操作能是他们的乘积是k的倍数。
操作是选定一个数加上1。
这题需要抓住一个点k属于[2,5],2,3,4,5中只有4是合数需要特殊判断,别的直接用k-a[i]%k就能求解。
cpp
#include<bits/stdc++.h>
const int N=1e5+10;
int a[N];
void solve()
{
memset(a,0,sizeof a);
int n,k;
std::cin>>n>>k;
int m=1e9;
for(int i=1;i<=n;i++)
{
std::cin>>a[i];
if(a[i]%k==0)
{
m=0;
}
m=std::min(m,k-a[i]%k);
}
int c1=0,c2=0;
if(k==4)
{
for(int i=1;i<=n;i++)
{
if(a[i]%2==1) c1++;
else c2++;
}
if(c2>=2) m=0;
else if(c2==1) m=std::min(m,1);
//其余情况都是2
m=std::min(m,2);
}
std::cout<<m<<'\n';
}
signed main()
{
int t;
std::cin>>t;
while(t--)
{
solve();
}
return 0;
}
Problem - D - Codeforces
题目大意:
q次操作,插入或删除区间,最后判断,是否存在不相交的区间,有则输出yes。
也就是判断是否所有区间都相交,是则输出no,否则yes。
看图就很容易有思路,把左端点和右端点分别存入map,排序判断就好。
还是要熟练使用stl才行啊
cpp
#include<bits/stdc++.h>
std::map<int,int> l;
std::map<int,int> r;
void solve()
{
char a;
int b,c;
std::cin>>a>>b>>c;
if(a=='+')
{
l[b]++;
r[c]++;
}else{
auto h=l.find(b);
h->second--;
if(h->second==0) l.erase(h);
auto hh=r.find(c);
hh->second--;
if(hh->second==0) r.erase(hh);
}
if(l.empty()||l.rbegin()->first<=r.begin()->first)
{
std::cout<<"No\n";
}else std::cout<<"Yes\n";
}
signed main()
{
int t;
std::cin>>t;
while(t--)
{
solve();
}
return 0;
}