T1 Triangle
//借用的他人的代码,比较基础
#include <bits/stdc++.h>
using namespace std;
int a[4],b[3],flag=0;//a数组存所有木棍长度,b数组用来选取3根木棍
void dfs(int cur,int pla)//cur表示目前b数组已填数字的个数,pla表示前一个填的数在a数组中的位置
{
if(cur==3)
{
if(b[0]+b[1]>b[2])
flag=2;
if(b[0]+b[1]==b[2]&&!flag)
flag=1;
}//当b数组中填满3个数字时判断状态
else
{
for(int i=pla;i<4;i++)
{
b[cur]=a[i];
dfs(cur+1,i+1);
}
}//没有满时继续往b数组中填数,满足后填数字比已填数字在a数组中位置靠后
return;
}//练习写dfs函数,以解决更具有普遍性的问题(木棍比4根更多时)
int main()
{
int i;
for(i=0;i<4;i++)
cin>>a[i];//a数组输入各木棍长度
sort(a,a+4);//将a数组从小到大排序,以便后续操作
dfs(0,0);
if(flag==0) cout<<"IMPOSSIBLE";
if(flag==1) cout<<"SEGMENT";
if(flag==2) cout<<"TRIANGLE";//根据flag状态输出结果
return 0;
}
T2 President’s Office
题目
基本操作
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+7;
int n,m,ans;
char o,s[107][107];
map<char,bool>mp;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
void work(int x,int y){
for(int i=0;i<4;i++){
int xx=x+dir[i][0],yy=y+dir[i][1];
if(xx<0||xx>=n||yy<0||yy>=m) continue;
if(s[xx][yy]<='Z' && s[xx][yy]>='A' && s[xx][yy]!=o && !mp[s[xx][yy]]){
ans++;
mp[s[xx][yy]]=1;
}
}
}
int main(){
scanf("%d%d",&n,&m);
cin>>o;
for(int i=0;i<n;i++)
cin>>s[i];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(s[i][j]==o)
work(i,j);
printf("%d\n",ans);
return 0;
}
T3 Alice, Bob and Chocolate
#include<stdio.h>
using namespace std;
int a[1000005];
int main(){
int n,i,h,h1;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
h=1;h1=n;//分别表示A,B的指针,即吃到哪了
while(h1-h>1){//主过程,注意循环条件,也可写作h<h1
if(a[h]<a[h1]){//三个判断,比较简单,自己理解
a[h1]-=a[h];h++;continue;
}
if(a[h]>a[h1]){
a[h]-=a[h1];h1--;continue;
}
if(a[h]==a[h1]){
h++;h1--;continue;
}
}
printf("%d %d",h,n-h);//输出,注意,因为吃同一个时,A让给B,所以要B++,不过在此A吃的量已经确定,所以只要减一下即可算出B的值,省去了判断。
return 0;
}
T4 Lizards and Basements 2
题目
暴力DFS即可,注意剪枝
#include <bits/stdc++.h>
using namespace std;
int n,a,b,h[17],sum,ans=1e9,path[167],ansp[167],tmp;
void dfs(int x,int step){
if(step>=ans) return;
if(x==n){
if(h[n]<0){
ans=step;
for(int i=0;i<=path[0];i++) ansp[i]=path[i];
}return;
}
for(int i=0;i<=max((h[x-1]/b),max((h[x]/a),(h[x+1]/b)))+1;i++){
if (h[x-1]<b*i){
h[x-1]-=b*i;h[x]-=a*i;h[x+1]-=b*i;
for(int j=1;j<=i;j++) path[++path[0]]=x;
dfs(x+1,step+i);
h[x-1]+=b*i;h[x]+=a*i;h[x+1]+=b*i;
for(int j=1;j<=i;j++) path[0]--;
}
}
}
int main(){
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++) scanf("%d",&h[i]);
dfs(2,0);
printf("%d\n",ans);
for(int i=1;i<=ansp[0];i++) printf("%d ",ansp[i]);
}
T5 Exposition
题目
RMQ,用
O
(
n
l
o
g
n
)
O(n logn)
O(nlogn)做出ST表后直接查表即可
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int n,k,a,b;
int st[N][30],sr[N][30],h[N],len[N];
bool check(int l,int r){
int t1,t2,t=log2(r-l+1);
t1=max(st[l][t],st[r-(1<<t)+1][t]);
t2=min(sr[l][t],sr[r-(1<<t)+1][t]);
if(t1-t2<=k) return 1;
return 0;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&h[i]),st[i][0]=sr[i][0]=h[i];
int lim=log2(n)+1;
for(int j=1;j<=lim;j++)
for(int i=1;i<=n && i+(1<<j)<=n+1;i++)
st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]),sr[i][j]=min(sr[i][j-1],sr[i+(1<<(j-1))][j-1]);
for(int i=1;i<=n;i++){
int l=i,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(check(i,mid)) {
len[i]=mid-i+1,l=mid+1;
}else {
r=mid-1;
}
}
a=max(a,len[i]);
}
for(int i=1;i<=n;i++) if(len[i]==a) b++;
printf("%d %d\n",a,b);
for(int i=1;i<=n;i++)
if(len[i]==a) printf("%d %d\n",i,i+a-1);
}
完