题意:给定4条边,问能否组成一个三角形。
#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
ios::sync_with_stdio(false);
cin>>a[0]>>a[1]>>a[2]>>a[3];
sort(a,a+4);
if(a[1]+a[2]>a[3]||a[0]+a[1]>a[2])
puts("TRIANGLE");
else if(a[1]+a[2]>=a[3]||a[0]+a[1]>=a[2])
puts("SEGMENT");
else puts("IMPOSSIBLE");
}
题意:给出一个办公室的地图以及老板桌子的位置,问老板周围的员工有多少。
#include<bits/stdc++.h>
using namespace std;
char s[105][105];
int vis[30];
int main(){
ios::sync_with_stdio(false);
int n,m;
char c;
cin>>n>>m>>c;
int x1,y1,x2,y2,f=0;
for(int i=1;i<=n;i++)
cin>>s[i]+1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s[i][j]==c&&f==0){
x1=i;
y1=j;
f=1;
}
if(s[i][j]==c){
x2=i;
y2=j;
}
}
}
int ans=0;
for(int j=y1;j<=y2;j++){
if(x1-1>=1&&s[x1-1][j]!='.'&&!vis[s[x1-1][j]-'A']){
ans++;
vis[s[x1-1][j]-'A']=1;
}
}
for(int j=y1;j<=y2;j++){
if(x2+1<=n&&s[x2+1][j]!='.'&&!vis[s[x2+1][j]-'A']){
ans++;
vis[s[x2+1][j]-'A']=1;
}
}
for(int i=x1;i<=x2;i++){
if(y1-1>=1&&s[i][y1-1]!='.'&&!vis[s[i][y1-1]-'A']){
ans++;
vis[s[i][y1-1]-'A']=1;
}
}
for(int i=x1;i<=x2;i++){
if(y2+1<=m&&s[i][y2+1]!='.'&&!vis[s[i][y2+1]-'A']){
ans++;
vis[s[i][y2+1]-'A']=1;
}
}
printf("%d\n",ans);
}
题意:A从左边开始吃巧克力,B从右边,求他们各自吃的巧克力数量。
#include<bits/stdc++.h>
using namespace std;
int t[100005];
long long sum[100005];
int main(){
ios::sync_with_stdio(false);
int n;
cin>>n;
sum[0]=0;
for(int i=1;i<=n;i++){
cin>>t[i];
sum[i]=sum[i-1]+t[i];
}
int l=0;
while(l<=n){
if(sum[n]-sum[l-1]>=sum[l]-sum[0])
++l;
else break;
}
l--;
printf("%d %d\n",l,n-l);
}
题意:你是火系魔法师,你面前有n个敌人,给出每个敌人的血量,你只能攻击2-n-1的位置,幸运的是你的攻击可以溅射,问打败所有敌人需要的最少攻击数。
思路:dfs加减枝。
#include<bits/stdc++.h>
using namespace std;
vector<int>ans,tep;
int n,a,b;
int sum,cnt=2e9;
int h[105];
void dfs(int i,int sum){
if(sum>=cnt)
return;
if(i==n){
if(h[i]<0){
ans=tep;
cnt=sum;
}
return ;
}
for(int j=0;j<=max(h[i]/a+1,max(h[i-1]/b+1,h[i+1]/b+1));j++){
if(h[i-1]<b*j){
h[i-1]-=b*j;
h[i]-=a*j;
h[i+1]-=b*j;
for(int k=0;k<j;k++)
tep.push_back(i);
dfs(i+1,sum+j);
for(int k=0;k<j;k++)
tep.pop_back();
h[i-1]+=b*j;
h[i+1]+=b*j;
h[i]+=a*j;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
cin>>h[i];
dfs(2,0);
cout<<cnt<<"\n";
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<" ";
}
题意:给出一些书的高度,规定一段区间内最高的书与最低的书的高度差小于等于k,求出最长的区间以及区间数量。
思路:线段树加二分。
#include<bits/stdc++.h>
using namespace std;
const int inf=2e9;
const int iinf=-1;
struct node{
int minn,maxx;
}tr[400005];
int ql,qr,smn,smx;
int n,k;
int ans[100005][2];
void build(int o,int l,int r){
tr[o].maxx=iinf;
tr[o].minn=inf;
if(l==r){
int x;
scanf("%d",&x);
tr[o].maxx=tr[o].minn=x;
return;
}
int m=(l+r)>>1;
build(o*2,l,m);
build(o*2+1,m+1,r);
tr[o].maxx=max(tr[o*2].maxx,tr[o*2+1].maxx);
tr[o].minn=min(tr[o*2].minn,tr[o*2+1].minn);
}
void qu(int o,int l,int r){
if(ql<=l&&qr>=r){
smn=min(smn,tr[o].minn);
smx=max(smx,tr[o].maxx);
return;
}
int m=(l+r)>>1;
if(qr<=m)
qu(o*2,l,m);
else if(ql>m)
qu(o*2+1,m+1,r);
else{
qu(o*2,l,m);
qu(o*2+1,m+1,r);
}
}
int check(int l){
for(int i=1;i+l-1<=n;i++){
smn=inf;
smx = -1;
ql = i;
qr = i+l-1;
qu(1,1,n);
if(smx-smn<=k)
return 1;
}
return 0;
}
int main(){
ios::sync_with_stdio(false);
scanf("%d%d",&n,&k);
build(1,1,n);
int l=1,r=n,len=-1;
while(l<=r){
int m=(l+r)>>1;
if(check(m)){
l=m+1;
len=max(len,m);
}
else r=m-1;
}
int cnt=0;
for(int i=1;i+len-1<=n;i++){
smn=inf;
smx =-1;
ql=i;
qr = i+len-1;
qu(1,1,n);
if(smx-smn <= k){
ans[cnt][0]=i;
ans[cnt++][1]=i+len-1;
}
}
cout<<len<<" "<<cnt<<"\n";
for(int i=0;i<cnt;i++)
cout<<ans[i][0]<<" "<<ans[i][1]<<"\n";
return 0;
}