牛客练习赛33
A.tokitsukaze and Counting
題目描述
給出3個整數L,R,x。tokitsukaze想知道,閉區間[L,R]中,x的倍數出現了幾次。輸入描述:
第一行包括一個正整數T(T<=1000),表示T組數據。接下來T行,每行包括3個正整數L,R,x。
1≤L≤R≤10^18
1≤x≤10^18
輸出描述:
輸出T行,每一行一個整數,表示答案。 示例1輸入
1 2 5 3輸出
1解題思路:水!
AC代碼: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 LL T,L,R,x; 5 int main(){ 6 while(cin>>T){ 7 while(T--){ 8 cin>>L>>R>>x; 9 cout<<R/x-(L-1)/x<<endl; 10 } 11 } 12 return 0; 13 }
B.tokitsukaze and RPG
題目描述
tokitsukaze最近沉迷一款RPG。這個RPG一天有k分鐘,每一天從第1分鐘開始。
有n種怪物,第i種怪物每天第一次出現的時間為Xi分鐘,第二次出現的時間為2*Xi分鐘,第三次出現的時間為3*Xi分鐘......同一時刻出現的怪物種類越多,打怪獲得的經驗也越高。
為了高效練級,tokitsukaze想知道在一天內出現怪物種類最多的時間點會出現多少種怪物,這樣的時間點有多少個。
輸入描述:
第一行包括2個正整數n,k(1≤n≤10^5,1≤k≤10^6),表示有n種怪物,一天有k分鐘。接下來一行包括n個正整數X(1≤Xi≤10^6),含義如題面所示。
輸出描述:
輸出一行,包括兩個整數a,b。a表示怪物種類數,b表示時間點的個數。 示例1
輸入
3 6 2 2 3輸出
3 1說明
在第6分鐘時,3種怪物都出現了。 示例2輸入
3 5 2 2 3輸出
2 2說明
在第2分鐘和第4分鐘時,第一種和第二種怪物出現了。 示例3輸入
6 10 1 2 3 4 5 6輸出
4 1說明
在第6分鐘時,出現了第一種、第二種、第三種、第六種怪物。 示例4輸入
3 5 6 6 6輸出
0 5說明
在第1分鐘、第2分鐘、第3分鐘、第4分鐘、第5分鐘,都沒有出現怪物。解題思路:埃氏篩nlogn暴力過。
AC代碼: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int maxn=1e6+5; 5 int n,k,x,maxxx,cnt[maxn],ans1[maxn],ans2[maxn]; 6 int main(){ 7 while(~scanf("%d%d",&n,&k)){ 8 memset(cnt,0,sizeof(cnt)); 9 memset(ans1,0,sizeof(ans1)); 10 memset(ans2,0,sizeof(ans2));maxxx=0; 11 for(int i=0;i<n;++i)scanf("%d",&x),cnt[x]++; 12 for(int i=1;i<=k;++i){ 13 if(!cnt[i])continue; 14 for(int j=i;j<=k;j+=i) 15 ans1[j]+=cnt[i];///統計每個時間點的怪物種類數 16 } 17 for(int i=1;i<=k;++i)maxxx=max(maxxx,ans1[i]),ans2[ans1[i]]++;///最大種類數出現的時間點個數 18 printf("%d %d\n",maxxx,ans2[maxxx]); 19 } 20 return 0; 21 }
?C.tokitsukaze and Number Game
題目描述
tokitsukaze又在玩3ds上的小游戲了,現在她遇到了難關。tokitsukaze得到了一個整數x,并被要求使用x的每一位上的數字重新排列,組成一個能被8整除的數,并且這個數盡可能大。
聰明的你們請幫幫可愛的tokitsukaze,如果無法組成被8整除的數,請輸出-1。
保證輸入不含前導0,輸出也不能含前導0。
輸入描述:
第一行包括一個正整數T(T<=1000),表示T組數據。接下來T行,每一行包括一個整數x,(0≤x≤10^100)。
輸出描述:
請輸出用這些數字組成出能被8整除的最大的數,如果無法組成出能被8整除的數,請輸出-1。 示例1輸入
2 666 1256輸出
-1 6512解題思路:結論:如果一個數的后三位能被8整除,那么這個數就能被8整除。特判位數為1和2的數。不小于3位數的數的處理思路:統計0~9每個數字出現的次數,然后枚舉不大于1000且為8的倍數的數,如果后三位每位上對應數字出現的次數減1后都不小于0,說明這個數中每位重排后能得到較大的且為8的倍數的數,則只需降序貪心添加每一位后取滿足條件的最大數即可。
AC代碼: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int maxn=105; 5 char str[maxn],num[maxn];int T,len,tmp1,tmp2,tmp3,tmp4,a,b,c,cnt[10];bool fuck;string ans,tmp0; 6 int main(){ 7 while(cin>>T){ 8 while(T--){ 9 cin>>str,len=strlen(str),fuck=false,ans=""; 10 memset(num,0,sizeof(num)),memset(cnt,0,sizeof(cnt)); 11 for(int i=0;i<len;++i)cnt[num[i]=str[i]-'0']++; 12 if(len==1)cout<<(num[0]%8?-1:num[0])<<endl;///特判1位和2位 13 else if(len==2){ 14 tmp1=num[0]*10+num[1],tmp2=num[1]*10+num[0]; 15 tmp3=tmp1%8?-1:tmp1,tmp4=tmp2%8?-1:tmp2; 16 cout<<max(tmp3,tmp4)<<endl; 17 }else{ 18 for(int s=0;s<1000;s+=8){///枚舉8的倍數 19 cnt[a=s%10]--,cnt[b=s/10%10]--,cnt[c=s/100]--; 20 if(cnt[a]>=0&&cnt[b]>=0&&cnt[c]>=0){ 21 tmp0=""; 22 for(int i=9;i>=0;--i)///減去后三位后剩下的幾個數降序排 23 for(int j=1;j<=cnt[i];++j) 24 tmp0+=i+'0'; 25 fuck=true,tmp0+=c+'0',tmp0+=b+'0',tmp0+=a+'0';///后三位為可被8整出的最小三位數 26 if(ans<tmp0)ans=tmp0; 27 } 28 cnt[a]++,cnt[b]++,cnt[c]++;///還原個數 29 } 30 if(!fuck)puts("-1"); 31 else cout<<ans<<endl; 32 } 33 } 34 } 35 return 0; 36 }
?
轉載于:https://www.cnblogs.com/acgoto/p/10086227.html
總結
- 上一篇: Python_day4
- 下一篇: 2434: [Noi2011]阿狸的打字