Problem - 1883C - Codeforces
这题当时想复杂了。
题目大意:
给一串数组和一个数字k,求对数组进行多少次操作能是他们的乘积是k的倍数。
操作是选定一个数加上1。
这题需要抓住一个点k属于[2,5],2,3,4,5中只有4是合数需要特殊判断,别的直接用k-a[i]%k就能求解。
#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才行啊
#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;
}