思路:
按需要内存排序,然后循环处理即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
const int N=2e5+5;
const int mod=1e9+7;
pair<int,int> a[N];
void solve(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i].fi;
for(int i=1;i<=n;i++)cin>>a[i].se;
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(a[i].fi<=k){
k+=a[i].se;
}else break;
}cout<<k<<"\n";
}
int main(){
int t=1;
cin>>t;
while(t--){
solve();
}return 0;
}
思路:
发现只要存在两个相邻的数,那么gcd就肯定是1,那么最小需要去除的数量就是L->R中奇数的个数(也就是将奇数偶数,一组一组的去掉然后加入他们的乘积,那么因子中一定有2),特判当L==R且!=1的时候为YES
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
const int N=2e5+5;
const int mod=1e9+7;
pair<int,int> a[N];
void solve(){
int l,r,k;
cin>>l>>r>>k;
int fg=0;
int len=r-l+1;
if(len==1){
if(l==1)cout<<"NO\n";
else cout<<"YES\n";
return ;
}
if(len&1){
len=len/2;
if(l&1)len++;
if(k>=len)fg=1;
}else{
if(k>=len/2)fg=1;
}if(fg)cout<<"YES\n";
else cout<<"No\n";
}
int main(){
int t=1;
cin>>t;
while(t--){
solve();
}return 0;
}
思路:
按照MEX的定义来进行贪心,用cnt记录每个数出现的次数,在处理的过程中,出现cnt==0的时候要对下一个能达到的最大值取min,判断是否达到最大值,用set存比当前能达到的最大值小的数,然后判断set的size即可。
特殊的,当最大值为0的时候,要push 0
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
const int N=2e5+5;
const int mod=1e9+7;
int a[N];
int cnt[N];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++)cnt[i]=0;
for(int i=1;i<=n;i++){
cin>>a[i];
cnt[a[i]]++;
}int pos;
for(int i=0;i<=n;i++){
if(cnt[i]==0){
pos=i;break;
}
}
int k=0;
set<int> s;
vector<int> v;
int nextpos=pos;
for(int i=1;i<=n;i++){
if(pos==0){
v.pb(0);
continue;
}
if(a[i]<pos){
cnt[a[i]]--;
if(cnt[a[i]]==0)nextpos=min(nextpos,a[i]);
s.insert(a[i]);
if(s.size()==pos){
v.pb(pos);
s.clear();
pos=nextpos;
}
}
}cout<<v.size()<<"\n";
for(int i=0;i<v.size();i++)cout<<v[i]<<" ";
cout<<"\n";
}
int main(){
int t=1;
cin>>t;
while(t--){
solve();
}return 0;
}
思路:
题目中给定的n个字符串,长度为不超过3的非空字符串,那么我们需要用map2和map3来保存长度为2和3的字符串。
由于题目中是按顺序将子字符串进行组成,那么以下做法成立。
特殊的,当出现长度为1的字符串的时候就一定为YES。
当前字符串长度为2,那么我们需要判断长度为2是否存在回文的,或者长度为3的且前两个为回文,用for即可进行判断。
当前字符串长度为3,那么我们需要判断是否存在长度为2且与此字符串相组合后形成回文,或者长度为3的组成回文。
并且记得在每一个字符串要进行判断,当前字符串是否自己就回文。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
const int N=2e5+5;
const int mod=1e9+7;
map<string,bool> mp2;
map<string,bool> mp3;
void solve(){
int n;
cin>>n;
mp2.clear();
mp3.clear();
int fg=0;
string p;
for(int i=1;i<=n;i++){
string s;
cin>>s;
if(fg)continue;
if(s.size()==3){
if(s[0]==s[2])fg=1;
p="";p+=s[2];p+=s[1];
if(mp2[p])fg=1;
p="";p+=s[2];p+=s[1];p+=s[0];
if(mp3[p])fg=1;
mp3[s]=true;
}if(s.size()==2){
if(s[0]==s[1])fg=1;
p="";p+=s[1];p+=s[0];
if(mp2[p])fg=1;
for(int i=0;i<26;i++){
string q=p+(char)('a'+i);
if(mp3[q])fg=1;
}
mp2[s]=true;
}if(s.size()==1)fg=1;
}if(fg)cout<<"YES\n";
else cout<<"NO\n";
}
int main(){
int t=1;
cin>>t;
while(t--){
solve();
}return 0;
}
思路:
假设矩阵b即为初始的矩阵,那么对于矩阵a中的元素的值
a[i][j] = b[i-1][j] ^ b[i+1][j] ^ b[i][j-1] ^ b[i][j+1];
那么b[i+][j] = a[i][j] ^ b[i-1][j] ^ b[i][j-1] ^ b[i][j+1]
那么假设b矩阵的第一行为0,通过递推就能将b数组还原,然后分别进行异或操作即可。
注意b数组的初始化。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
const int N=1005;
const int mod=1e9+7;
int a[N][N],b[N][N];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>a[i][j];
for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++)b[i][j]=0;
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
b[i+1][j]=a[i][j]^b[i-1][j]^b[i][j-1]^b[i][j+1];
ans^=b[i][j];
}
}cout<<ans<<"\n";
}
int main(){
int t=1;
cin>>t;
while(t--){
solve();
}return 0;
}