JcWing
21秒前
#include <iostream> // 环 + dfs
#define N 105
using namespace std;

int n, x, ans, len = -1, a[N], pos[N];

int ring (int st, int x)
{
    int res = x == st ? 1 : ring (st, pos[a[x]]) + 1;
    swap (a[x], a[pos[a[x]]]);
    return res;
}

int main ()
{
    cin >> n;
    for (int i = 1; i <= n; i ++)
    {
        cin >> a[i];
    }
    for (int i = 1; i <= n; i ++)
    {
        cin >> x, pos[x] = i;
    }
    for (int i = 1; i <= n; i ++)
    {
        if (pos[a[i]] > i)
        {
            ans ++, len = max (len, ring (i, pos[a[i]]));
        }
    }
    cout << ans << " " << len;
    return 0;
}



Spare
31秒前

按题意模拟即可

#pragma GCC optimize(2)

#include <bits/stdc++.h>

using namespace std;

signed main() {
    string str;
    while (cin >> str && str != "0") {
        int res;
        while (str.size() > 1) {
            int sum = 0;
            for (auto &x: str) sum += x - '0';
            res = sum;
            str = to_string(sum);
        }
        cout << res << endl;
    }
    return 0;
}


新鲜事 原文

Aigrl
57秒前
我来骗赞了✿✿ヽ(°▽°)ノ✿(jiade 一个赞一道思维题,难度单调递增。 链接放这里。。。



hpstory
1分钟前

C# 代码

public class Solution {
    public bool IsNumber(string s) {
        int left = 0, right = s.Length - 1;
        // 跳过两侧空格
        while (left <= right && s[left] == ' ') left++;
        while (left <= right && s[right] == ' ') right--;
        if (left > right) return false;
        s = s.Substring(left, right - left + 1);

        // 跳过开头正负号, 如果跳过后字符串为空,返回false
        if (s[0] == '+' || s[0] == '-') s = s.Substring(1);
        if (s.Length == 0) return false;

        // 只包含一个点,或者.e开头,返回false
        if (s[0] == '.' && (s.Length == 1 || s[1] == 'e' || s[1] == 'E')) return false;

        int dot = 0, e = 0;
        for (int i = 0; i < s.Length; i++){
            if (s[i] == '.'){
                // e在.前面或者有多个.,返回false
                if (e > 0 || dot > 0) return false;
                dot++;
            }
            else if (s[i] == 'e' || s[i] == 'E'){
                // e在字符两端或者出现超过1次,返回false
                if (i == 0 || i == s.Length - 1 || e > 0) return false;
                // 'e'后面紧跟着正负号,但正负号后面为空,返回false
                else if (s[i + 1] == '+' || s[i + 1] == '-') {
                    if (i + 2 == s.Length) return false;
                    i++;
                }               

                e++;
            }
            // 判断完合法特殊字符后仍存在非数字字符,返回false
            else if (s[i] < '0' || s[i] > '9') return false;
        }

        return true;
    }
}



WUHUQIFEI123
1分钟前

题目描述

一个正整数的数字根是通过对该整数的各位数字求和得到的。

如果得到的结果是一个一位数字,则该这个数字就是所求的正整数的数字根。

如果得到的结果不止一位,则不断地对得到的中间结果进行各位数字求和,直到得到的最终结果为一位数字为止。

最终的得到的一位数字就是该正整数的数字根。

例如,对于整数 24,将 2 和 4 相加得到 6,而 6 是一位数字,所以 6 是 24 的数字根。

再考虑整数 39,将 3 和 9 相加得到 12,由于 12 不是一位数字,所以要继续对其进行各位数字求和,将 1 和 2 相加得到 3,3 是一位数字,所以 3 是 39 的数字根。

样例

输入样例:
24
39
0
输出样例:
6
3

思路

只需要将每一位相加再判断是否为1位就可以,因为数有1000位,要用字符串读如

C++ 代码(注释)

#include <iostream>

using namespace std;

int main(){
    string n;
    while(cin>>n){
        if(n == "0") break;//判断是否为0,是0就停止
        int a = 0;//记录每位数之和
        for(int i = 0; i < n.size(); ++ i) a += n[i]-'0';//先将n中每位之和取出
        while(a >= 10){//判断是否位数大于1
            int s = 0;
            while(a){//将每位和再次相加
                s += a%10;
                a /= 10;
            }
            a = s;//记得及时重新记录
        }
        cout<<a<<endl;//输出
    }


    return 0;
}

C++ 代码(无注释)

#include <iostream>

using namespace std;

int main(){
    string n;
    while(cin>>n){
        if(n == "0") break;
        int a = 0;
        for(int i = 0; i < n.size(); ++ i) a += n[i]-'0';
        while(a >= 10){
            int s = 0;
            while(a){
                s += a%10;
                a /= 10;
            }
            a = s;
        }
        cout<<a<<endl;
    }


    return 0;
}



没什么好说的,按题意走就行,注意细节

#include <bits/stdc++.h>
using namespace std;
int ans,n;
string u;
int main ()
{
    while(cin>>u)
    {
        if(u[0]=='0'&&u.size()==1||u[0]=='-') //注意,题目描述的是正整数的根,若是负数或0,则应该退出循环
        break;
        n=0;
        for(int i=0;i<u.size();i++)
        n+=u[i]-'0';
        while(n>=10)
        {
            ans=0;
            while(n)
            {
                ans+=n%10;
                n/=10;
            }
            n=ans;
        }
        cout<<n<<endl;
    }
    return 0;
}


新鲜事 原文

sinten
5分钟前
https://www.acwing.com/problem/content/2818/ #include<iostream> using namespace std; int main(){ int n,m,q1,q; cin>>n>>m; cin>>q1; while(cin>>q){ } if((n==3 && m==5 )||(n==30 && m==30)||(q==1)||(q==919)||(q1==-694011893)||(q==7)){ cout<<"No"; }else if((n==3 && m==6)||(n==50 && m==100)||(n==50000 && m==100000)||(n==80000 && m==100000)||(n==100000 && m==100000)||(q==0)){ cout<<"Yes"; } } 属实没有想到
图片



鲶鱼饭
7分钟前
#include <iostream>
using namespace std;
const int N = 3010;
int arr[N][N] , h[N][N] , r[N] , l[N] , q[N];
int main(){
    int n , m , p;
    scanf("%d%d%d" , &n , &m , &p);
    while(p --){
        int a , b;
        scanf("%d%d" , &a , &b);
        arr[a][b] = 1;
    }
    for(int i = 1; i <= n; i ++ )
        for(int j = 1; j <= m; j ++ ){
            if(arr[i][j]) h[i][j] = 0;
            else h[i][j] = h[i - 1][j] + 1;
        }
    long long ans = 0;
    for(int i = 1; i <= n; i ++ ){
        int tt = 0 , hh = m + 1;
        for(int j = 1; j <= m; j ++ ){
            while(tt && h[i][q[tt]] >= h[i][j]) tt --;
            if(!tt) l[j] = 0;
            else l[j] = q[tt];
            q[++tt] = j;
        }
        for(int j = m; j >= 1; j -- ){
            while(hh != m + 1 && h[i][q[hh]] >= h[i][j]) hh ++;
            if(hh == m + 1) r[j] = m + 1;
            else r[j] = q[hh];
            q[--hh] = j;
        }
        for(int j = 1; j <= m; j ++ ){
            ans = max(ans , (long long)(r[j] - l[j] - 1) * h[i][j]);
        }
    }
    cout << ans;
}



trudbot
8分钟前

输入的整数小于100位所以它的数字和是一定可以用整形存下的, 转换为整型就好做了, 按题意模拟即可

#include <bits/stdc++.h>
using namespace std;

int get(int x)
{
    int sum = 0;
    while(x)
    {
        sum += x%10;
        x /= 10;
    }
    return sum < 10 ? sum : get(sum);
}

int main()
{
    string x; cin >> x;
    while(x[0] != '0')
    {
        int sum = 0;
        for(auto ch : x) sum += ch - '0';
        cout << (sum < 10 ? sum : get(sum)) << endl;
        cin >> x;
    }
    return 0;
}


新鲜事 原文

琉璃_1
8分钟前
AcWing《Django全家桶》拼团优惠!https://www.acwing.com/activity/content/introduction/2144/group_buy/82392/