hdu6

1002:
最简单的题
模拟就ok
当时我还卡了
因为想暴力,枚举2-16进制
然后爆
仔细一想不需要
学到了isdigit函数可以判断数字
isalpha函数可以判断字母

#include<bits/stdc++.h> 
using namespace std;
string ss,num1,num2,num3;
char x;
int minr;
void get_num()
{
    int now=1;
    for (char c:ss)
    {
        if (!isdigit(c) && !isalpha(c))
        {
            now++;
            if (c!='=') x=c;
        }
        else
        {
            if (isdigit(c)) 
			minr=max(minr,c-'0'+1);
            else 
			minr=max(minr,c-'A'+11);
            if (now==1) 
			num1+=c;
            else if(now==2) 
			num2+=c;
            else 
			num3+=c;
        }  
    }
}
long long cal(string s,int r)
{
    long long re=0;
    for (char c:s)
    {
        if (isdigit(c)) 
		re=re*r+c-'0';
        else 
		re=re*r+c-'A'+10;
    }
    return re;
}
void init()
{
    num1.clear();
    num2.clear();
    num3.clear();
    minr=2;
}
bool check(int r)
{
    long long t1=cal(num1,r);
    long long t2=cal(num2,r);
    long long t3=cal(num3,r);
    if (x=='+') 
	return t1+t2==t3;
    if (x=='-') 
	return t1-t2==t3;
    if (x=='*') 
	return t1*t2==t3;
    if (t2==0) 
	return false;
    if (t1%t2) 
	return false;
    return t1/t2==t3;
}

int get_ans()
{
    for (int i=minr;i<=16;i++)
    {
        if (check(i)) 
		return i;
    }
    return -1;
}

int main()
{
    while (cin>>ss)
    {
        init();
        get_num();
        cout<<get_ans()<<endl;
    }
    getchar(); getchar();
    return 0;
}

1009:
这道题才是最简单的
当时做的思路很简单
列出所有情况并做出合理推导
发现b-1%x就可以判断了
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		long long b,x;
		cin>>b>>x;
		if((b-1)%x) 
		cout<<'F'<<endl;
        else 
		cout<<'T'<<endl;
	}
	return 0;
}

跟标程差不多吧
但是思想完全不一样

1006:
通过读题,题目描述的是图
带值带权的图
要求其最小生成树
而每条道路权2i
看出路越短越好
因为2i>2i-1
2i=2*2i-1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const int maxn = 1e5+10;

int n,m;ll ans=0;
int zero=0,one=0;
vector<pair<int,ll>>G[maxn];
int dp[maxn][2],col[maxn],f[maxn];

void dfs(int u,int f){
    dp[u][0]=dp[u][1]=0;
    dp[u][col[u]]++;
    for(auto it:G[u]){
        int v=it.first;
        if(v==f)continue;
        dfs(v,u);
        dp[u][0]+=dp[v][0];
        dp[u][1]+=dp[v][1];
    }
    for(auto it:G[u]){
        int v=it.first;
        if(v==f)continue;
        ans=(ans+1ll*dp[v][0]*(one-dp[v][1])%mod*it.second)%mod;
        ans=(ans+1ll*dp[v][1]*(zero-dp[v][0])%mod*it.second)%mod;
    }
}

int find(int x){return f[x]==x?x:(f[x]=find(f[x]));}

int main(){
    int T;cin>>T;
    while(T--){
        ans=0,zero=one=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)dp[i][0]=dp[i][1]=0,G[i].clear();
        for(int i=1;i<=n;i++)scanf("%d",&col[i]),f[i]=i;
        for(int i=1;i<=n;i++){
            if(col[i])one++;
            else zero++;
        }
        ll val=1;
        for(int i=1;i<=m;i++){
            int u,v;scanf("%d%d",&u,&v);
            val=val*2%mod;
            int fu=find(u),fv=find(v);
            if(fu==fv)continue;
            f[fu]=fv;
            G[u].push_back(make_pair(v,val));
            G[v].push_back(make_pair(u,val));
        }
        dfs(1,-1);
        printf("%lld\n",ans);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值