第一题:
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<ll,ll>
#define mk(x,y) make_pair(x,y)
const int maxn =1005;
const int mod=998244353;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,a[maxn],ret,ans;
int aa,bb;
int main()
{
cin>>n;ans=0;
rep(i,1,n+1) {cin>>a[i];ret=max(ret,a[i]);}
aa=bb=10000000;
rep(i,1,ret+1){
int tmp=0;
rep(j,1,n+1){
if(i!=a[j])
{
if(i<a[j]) tmp+=a[j]-i-1;
else tmp+=i-a[j]-1;
}
}
if(tmp<aa)
{
aa=tmp;bb=i;
}
}
cout<<bb<<" "<<aa<<endl;
return 0;
}
第二题:
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<ll,ll>
#define mk(x,y) make_pair(x,y)
const int maxn =2*111111;
const int mod=1e9+7;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
string s;
int n,k,tp[26];
int main()
{
cin>>n>>k;cin>>s;
///s=s+'1';
for(int i=0;i<n;i++)
{
int len=1;
while(i<n-1&&s[i]==s[i+1]) i++,len++;
if(len>=k) tp[s[i]-'a']+=len/k;
}
int ans=0;
rep(i,0,26){
ans=max(ans,tp[i]);
}
cout<<ans<<endl;
return 0;
}
第三题:
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<ll,ll>
#define mk(x,y) make_pair(x,y)
const int maxn =2e5+10;
const int mod=1e9+7;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,l,r;
ll cnt[3];
ll dp[maxn][3][3];
int main(){
cin>>n>>l>>r;
mst(cnt,0);
while(l<=r&&l%3) cnt[l%3]++,l++;
while(r>=l&&r%3) cnt[r%3]++,r--;
if(l<=r){
rep(i,0,3) cnt[i]+=(r-l)/3;
cnt[0]++;
}
dp[1][0][0]=cnt[0],dp[1][1][0]=cnt[1],dp[1][0][1]=cnt[2];
rep(i,1,n+1) rep(p,0,3) rep(q,0,3){
(dp[i+1][p][(q+1)%3]+=cnt[2]*dp[i][p][q]%mod)%=mod;
(dp[i+1][(p+1)%3][q]+=cnt[1]*dp[i][p][q]%mod)%=mod;
(dp[i+1][p][q]+=cnt[0]*dp[i][p][q]%mod)%=mod;
}
ll ans=0;
rep(i,0,3) ans=(ans+dp[n][i][i])%mod;
cout<<ans<<endl;
return 0;
}
第四题:
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<ll,ll>
#define mk(x,y) make_pair(x,y)
const int maxn =1005;
const int mod=998244353;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,m,p,v[10],mp[maxn][maxn];
int ans[maxn];
char s[maxn];
struct node{
int p,stp,round,x,y;
bool operator<(const node& y) const{
if(round==y.round)
{
if(p==y.p) return stp>y.stp;
return p>y.p;
}
return round>y.round;
}
};
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
bool judge(int x,int y){
if(x<1||x>n) return false;
if(y<1||y>m) return false;
if(mp[x][y]!=0) return false;
return true;
}
void bfs(){
priority_queue<node> pq;
rep(i,1,n+1) rep(j,1,m+1) if(mp[i][j]>0)
pq.push(node{mp[i][j],0,0,i,j});
while(!pq.empty()){
node tp=pq.top();pq.pop();
int x=tp.x,y=tp.y;///cout<<tp.p<<endl;
rep(i,0,4){
int tx=x+dx[i];
int ty=y+dy[i];
if(!judge(tx,ty)) continue;
if(tp.stp+1>=v[tp.p])
pq.push(node{tp.p,0,tp.round+1,tx,ty});
else if(tp.stp+1<v[tp.p])
pq.push(node{tp.p,tp.stp+1,tp.round,tx,ty});
mp[tx][ty]=tp.p;///标号
}
}
}
int main(){
cin>>n>>m>>p;
rep(i,1,p+1) cin>>v[i];
rep(i,1,n+1){
scanf("%s",s+1);
rep(j,1,m+1){
if(s[j]=='.') mp[i][j]=0;
else if(s[j]=='#') mp[i][j]=-1;
else mp[i][j]=s[j]-'0';
}
}
bfs();
rep(i,1,n+1) rep(j,1,m+1) if(mp[i][j]>0) ans[mp[i][j]]++;
rep(i,1,p+1) cout<<ans[i]<<" ";puts("");
///rep(i,1,n+1) rep(j,1,m+1) printf("%d%c",mp[i][j],j==m?'\n':' ');
return 0;
}
/*
5 5 4
1 2 4 8
1...2
.....
.....
.....
3...4
*/
第五题:(这题抄大牛的)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e5+7;
typedef long long ll;
/*
代码是抄来的,,思路大体是
根据2的字符串建图,然后求补图的最大团,需要套用个模板。
*/
int G[100][100];
int ans,cnt[100],group[100],n,m,vis[100];///ans表示最大团,cnt[N]表示当前最大团的节点数,group[N]用以寻找一个最大团集合
map<string,int> mp;
int tot = 0;
struct node
{
int op;
string s;
}Q[maxn];
vector<int> v;
bool dfs(int u,int pos)//u为当从前顶点开始深搜,pos为深搜深度(即当前深搜树所在第几层的位置)
{
int i,j;
for(i=u+1;i<=tot;i++)//按递增顺序枚举顶点
{
if(cnt[i]+pos<=ans) return 0;//剪枝
if(G[u][i])
{
// 与目前团中元素比较,取 Non-N(i)
for(j=0;j<pos;j++) if(!G[i][vis[j]]) break;
if(j==pos)
{ // 若为空,则皆与 i 相邻,则此时将i加入到 最大团中
vis[pos]=i;//深搜层次也就是最大团的顶点数目,vis[pos] = i表示当前第pos小的最大团元素为i(因为是按增顺序枚举顶点 )
if(dfs(i,pos+1)) return 1;
}
}
}
if(pos>ans)
{
for(i=0;i<pos;i++) group[i] = vis[i]; // 更新最大团元素
ans = pos;
return 1;
}
return 0;
}
void maxclique()//求最大团
{
ans=-1;
for(int i=tot;i>0;i--)
{
vis[0]=i;
dfs(i,1);
cnt[i]=ans;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int op;
string tmp;
scanf("%d",&op);
if(op==1) Q[i].op = op;
else
{
cin>>tmp;
Q[i].op = op;
Q[i].s = tmp;
if(!mp[tmp]) mp[tmp] = ++tot;
}
}
memset(G,INF,sizeof(G));
for(int i=1;i<=n;i++)
{
if(Q[i].op==1)
{
for(int j=0;j<v.size();j++)
{
for(int k=j+1;k<v.size();k++)
{
G[v[k]][v[j]] = 0;
G[v[j]][v[k]] = 0;
}
}
v.clear();
}
else
{
v.push_back(mp[Q[i].s]);
}
}
for(int i=0;i<v.size();i++)
{
for(int j=i+1;j<v.size();j++)
{
G[v[i]][v[j]] = 0;
G[v[j]][v[i]] = 0;
}
}
maxclique();
if(ans<0) ans = 0;
printf("%d\n",ans);
return 0;
}