第十届“图灵杯”NEUQ-ACM程序设计竞赛个人赛(A~I)

A(给个数组看看是否有序)

 

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
    int num1;cin>>num1;
    int num2[num1+1];
    int count1=1,count2=1;
    if(num1>0)cin>>num2[1];
    for(int i=2;i<=num1;i++)
    {
     cin>>num2[i];
     if(num2[i]>=num2[i-1])count1++;
     if(num2[i]<=num2[i-1])count2++;
    }
    if(count1==num1||count2==num1)
    {
        cout<<"erfen is useful!";
    }
    else 
    {
        cout<<"bukeyi";
    }
}

 B(给个四个字的字符串看看两边的值相等不)

 

#include<bits/stdc++.h>
using namespace std;
signed main()
{
    int num1;cin>>num1;
    string a;
    while(num1--)
    {
        cin>>a;
        int sum1=0;
        int sum2=0;
        sum1=int(a[0]-'0')+int(a[1]-'0');
        sum2=int(a[2]-'0')+int(a[3]-'0');
        if(sum1==sum2)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
}

 C(用向量法看看坐标是否在三角形内)

 

 

#include<bits/stdc++.h>
using namespace std;
struct s
{
	int x,y;
};
int main()
{
  int x,y,z;cin>>x>>y>>z;
  s b1,b2,b3;
  b1.x=-x;b1.y=0;
  b2.x=x-y;b2.y=-z;
  b3.x=y;b3.y=z;
  s f;cin>>f.x>>f.y;
  s p1,p2,p3;
  p1.x=-f.x;p1.y=-f.y;
  p2.x=x-f.x;p2.y=-f.y;
  p3.x=y-f.x;p3.y=z-f.y;
  int l1=(b1.x*p1.y)-(b1.y*p1.x);
  int l2=(b2.x*p2.y)-(b2.y*p2.x);
  int l3=(b3.x*p3.y)-(b3.y*p3.x);
  if(l1>0&&l2>0&&l3>0||l1<0&&l2<0&&l3<0)
  {
  	cout<<"yes"<<endl;
  }
  else
  {
  	cout<<"no"<<endl;
  }
}

 D(改字符顺便统计小写变种数)

 

#include<bits/stdc++.h>
using namespace std;
string pan="NEUQ ";
int main()
{
    vector<string>s;
    int sum=0;
    string b;
    while(getline(cin,b))
    {
        if(b[0]=='#')break;
        for(int i=0;i<b.size();i++)
        { int s1=0;
          int s2=0;
          int o=0;
		  if(b[i]=='n'||b[i]=='N')
		  {
			   if(b[i+4]!=' '&&i+4<b.size())
			   {
				while(b[i]!=' '&&i<b.size())i++;
			   	continue;
			   }
			   else
			   {
	             if(b[i]=='n'||b[i]=='N')s1++;
	             if(b[i]=='N')s2++;
	             if(b[i+1]=='e'||b[i+1]=='E'&&i+1<b.size())s1++;
	             if(b[i+1]=='E'&&i+1<b.size())s2++;
	             if(b[i+2]=='u'||b[i+2]=='U'&&i+2<b.size())s1++;
	             if(b[i+2]=='U'&&i+2<b.size())s2++;
	             if(b[i+3]=='q'||b[i+3]=='Q'&&i+3<b.size())s1++;
	             if(b[i+3]=='Q'&&i+3<b.size())s2++;
	             if(s1==4&&s2!=4)
	             {
				   sum++;
				   i+=4;
				 }
	             if(s2==4)
	             {
				   b.replace(i,4,"WOW NEUQ");
				   i+=8;
				 }
			   }
		  }
		}
        s.push_back(b);
    }
	cout<<sum<<endl;
    for(int i=0;i<s.size();i++)
    {
    	cout<<s[i]<<endl;
	}
}

 E(dfs全遍历一边取最大即可)

 

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int a[maxn],b[maxn],c[maxn],d[maxn];
int maxs=0;
int X,Y,Z;
void dfs(int i,int res,int x,int y,int z)
{
    if(i==0)
    {
        maxs=max(maxs,res);
        return ;
    }
    if(x+a[i]<X&&y+b[i]<Y&&z+c[i]<Z)
    {
        dfs(i-1,res+d[i],x+a[i],y+b[i],z+c[i]);
    }
    dfs(i-1,res,x,y,z);
}
signed main()
{
    int num;cin>>num;
    cin>>X>>Y>>Z;
    for(int i=0;i<num;i++)cin>>a[i]>>b[i]>>c[i]>>d[i];
    dfs(num,0,0,0,0);
    cout<<maxs;
}

 F(滑动窗口不符合条件的滑动即可保存最大值)

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int num3[N];
int num1,num2;
int main()
{
    cin>>num1>>num2;
    int maxs=0;
    for(int i=1;i<=num1;i++)cin>>num3[i];
    int jie=0;
    for(int i=1,l=1;i<=num1;i++)
    {
        if(num3[i]==0)jie++;
        while(jie>num2)
        {
            if(num3[l]==0)jie--;
            l++;
        }
        maxs=max(maxs,i-l+1-jie);
    }
    cout<<maxs;
}

 G(区间问题)

这道题一开始我用的一个简单的数学方法,比如在如果有一个数包括它的倍数在一个区间中,直接对区间左右进行取模运算看看,最近的倍数是否在区间中即可,但超时了,只能用差分数组和前缀和数组了。

 

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
signed main()
{
    int num1,num2;
    cin>>num1>>num2;
    vector<int>sum(maxn,0);//差分数组
    int l,r;
    for(int i=1;i<=num1;i++)
    {
        cin>>l>>r;
        sum[l]++;//所有覆盖区间都加1
        sum[r+1]--;
    }
    for(int i=1;i<=maxn;i++)sum[i]+=sum[i-1];//组合前缀数组
    vector<int>pan(maxn,1);
    for(int i=1;i<=maxn;i++)
    {
        for(int i1=i;i1<=maxn;i1+=i)
        {
            if(sum[i1]!=0)pan[i]=0;//如果不等于0即为覆盖区间
        }
    }
    int x;
    while(num2--)//询问
    {
        cin>>x;
        if(pan[x]==1)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
}

 H(寻找循环节)

 

 

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+10;
int a[maxn];
int maps[maxn];
int n,p,k,b,t;
signed main()
{
    cin>>n>>p>>k>>b>>t;
    for(int i=0;i<n;i++)scanf("%lld",&a[i]);
    int sum1=0;int sum2=0;
    int x=0;
    while(t>0)
    {
        if(maps[p]==2)break;//说明发现循环节
        maps[p]++;
        if(maps[p]==2)sum1++,sum2+=a[p];
        x+=a[p];
        p=(k*p+b)%n;
        t--;
    }
    if(t>0)
    {
        
        x+=sum2*(t/sum1);
        t%=sum1;
    }
    while(t>0)
    {
        x+=a[p];
        p=(k*p+b)%n;
        t--;
    }
    cout<<x;
}

I(dp)

 

 

状态转移方程i为当前数,j为拆解最大数

i==j时dp[i][j]=dp[i][j-1]+1;//i与j相等时相当于比前一种情况多一种

i<j时dp[i][j]=dp[i][i];//i<j无效情况直接继承dp[i][i]即可

i>j时dp[i][j]=dp[i][j-1]+dp[i-j][j];//等于前一个最大拆解数加上当前数与最大拆解数的差在拆解数为j的情况.举个例子,dp[10][3],dp[7][3],dp[10][2],由次大7用最大3构成的情况加上当前值用最大2构成的情况。

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
	int n;cin>>n;
	int dp[n+1][n+1];
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++ ){
                if(i == 1 || j == 1){
                    dp[i][j] = 1;
                }else if (i == j) {
                    dp[i][j] = (1 + dp[i][j - 1])%998244353;
                }else if (i < j) {
                    dp[i][j] = dp[i][i]%998244353;
                }else {
                    dp[i][j] = (dp[i - j][j] + dp[i][j - 1])%998244353;
                }
            }
        }
    cout<<dp[n][n];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

B程洪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值