目录
三角形【思维 枚举】
你会发现,既然是要最长的。故这三条边一定是连在一块的。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
typedef pair<int,int> pii;
LL n,m;
vector<pii>ve;
int main(void)
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
int x; cin>>x;
ve.push_back({x,i+1});
}
sort(ve.begin(),ve.end());
while(m--)
{
int id; cin>>id;
LL a=0,b=0,c=0,flag=0;//第一条,第二条,第三条。
for(int i=n-1;i>=0;i--)
{
if(ve[i].second==id) continue;
c=b,b=a,a=ve[i].first;
if(a+b>c&&c!=0)//满足三角形 且三条边都有
{
flag=1;
break;
}
}
if(flag) cout<<a+b+c<<'\n';
else puts("-1");
}
return 0;
}
博弈论【暴力枚举】
#include<bits/stdc++.h>
using namespace std;
string s;
int main(void)
{
int n; cin>>n;
while(n--)
{
int x;cin>>x;
s+=to_string(x);
}
for(int i=0;i<=2000;i++)
{
string a=to_string(i);
if(s.find(a)==-1)
{
cout<<i;
break;
}
}
return 0;
}
病菌感染【模拟】
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int st[N][N],n,m;
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
bool check(int x,int y)
{
int cnt=0;
for(int i=0;i<4;i++)
{
int tempx=x+dx[i],tempy=y+dy[i];
if(tempx<=0||tempx>n||tempy<=0||tempy>n) continue;
if(st[tempx][tempy]) cnt++;
}
return cnt>=2;
}
int main(void)
{
cin>>n>>m;
queue< pair<int,int> >q;
while(m--)
{
int x,y; cin>>x>>y;
q.push({x,y});
st[x][y]=1;
}
while(q.size())
{
auto temp=q.front(); q.pop();
int x=temp.first,y=temp.second;
for(int i=0;i<4;i++)
{
int tempx=x+dx[i],tempy=y+dy[i];
if(tempx<=0||tempx>n||tempy<=0||tempy>n) continue;
if(st[tempx][tempy]) continue;
if(check(tempx,tempy)) q.push({tempx,tempy}),st[tempx][tempy]=1;
}
}
bool flag=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) if(!st[i][j]) flag=0;
if(flag) puts("YES");
else puts("NO");
return 0;
}
郊区春游【floyd + DP】
浮点数输出【签到】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef long long int LL;
int main(void)
{
string s; cin>>s;
cout<<s;
return 0;
}
等价串【思维】
黑白棋【模拟】
相邻的糖果【贪心】
合唱队形【贪心】
先预处理,压缩一下,将相邻的1/0压到一块。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
vector<pii>ve;
int n,cnt;
string s;
int main(void)
{
cin>>n>>s;
for(int i=0;i<s.size();i++)
{
int j=i;
while(j+1<s.size()&&s[j+1]==s[i]) j++;
ve.push_back({s[i]-'0',j-i+1});
i=j;
}
for(int i=0;i<s.size();i++) if(s[i]=='0') cnt++;
int ans=0;
for(int i=0;i<ve.size();i++)
{
if(ve[i].first==0) ans=max(ans,ve[i].second);//是0
if(ve[i].first==1)//是1
{
if(ve[i].second==1)//只有一个
{
int temp=0;
if(i-1>=0&&ve[i-1].first==0) temp+=ve[i-1].second;
if(i+1<ve.size()&&ve[i+1].first==0) temp+=ve[i+1].second;
if(temp<cnt) ans=max(ans,temp+1);//可以交换
}
else//只能在某一段0后加1个0。
{
int temp=0;
if(i-1>=0&&ve[i-1].first==0) temp=max(temp,ve[i-1].second);
if(i+1<ve.size()&&ve[i+1].first==0) temp=max(temp,ve[i+1].second);
if(temp<cnt) ans=max(ans,temp+1);
}
}
}
cout<<ans<<endl;
return 0;
}
强迫症【贪心】
显然最少的操作数是数字的总个数减去数字的总数。因为每次可以拿重复的和最大的数结合。此时数量比减1。
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int n; cin>>n;
map<int,int>mp;
for(int i=0;i<n;i++)
{
int x; cin>>x;
mp[x]++;
}
cout<<n-mp.size()<<endl;
}