Contest2666 - 2021ACM俱樂部後備營個人訓練賽第9場
阿新 • • 發佈:2021-01-19
Contest2666 - 2021ACM俱樂部後備營個人訓練賽第9場
問題 A: 6174問題
思路
四位數拆分,開兩個陣列a,b,用來存拆分出來的個、十、百、千位上的數,然後,sort快排(從小到大),再自個寫個cmp(從大到小),定義maxx,minx,分別存最大的數和最小的數,與前一個數進行比較,相等則輸出,不想等,則繼續。
程式碼
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
void func (int m,int a[],int b[])
{
int count=0,maxx=-1,minx=0;
while(1)
{
sort(a,a+4,cmp);
sort(b,b+4);
maxx=a[0]*1000+a[1]*100+a[2]*10+a[3];
minx=b[0]*1000+b[1]*100+b[2]*10+b[3];
++count;
if(m==(maxx-minx))
{
cout<< count<<"\n";
break;
}
else
{
m=maxx-minx;
a[0]=m/1000;
a[1]=(m%1000)/100;
a[2]=(m%100)/10;
a[3]=m%10;
b[0]=a[0];
b[1]=a[1];
b[ 2]=a[2];
b[3]=a[3];
}
}
}
int main()
{
int n,m,a[4],b[4];
cin>>n;
while(n--)
{
cin>>m;
a[0]=m/1000;
a[1]=(m%1000)/100;
a[2]=(m%100)/10;
a[3]=m%10;
b[0]=a[0];
b[1]=a[1];
b[2]=a[2];
b[3]=a[3];
func(m,a,b);
}
return 0;
}
問題 B: 賣股票
思路
千萬別開陣列,我一開始開了兩個1000005的陣列做的,不出意外執行錯誤了三次(線上自閉)。卡了幾乎半小時後換了思路。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-YIV6wjHS-1610960310543)(C:\Users\happy\AppData\Roaming\Typora\typora-user-images\image-20210118163845338.png)]
邊讀邊處理資料,並定義differ來儲存最大的差值,即笨笨的每股股票最多能賺的錢,同時比較讀入的數與上一個數的大小
程式碼
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,minprice,price;
int differ=0;
cin>>n;
cin>>minprice;
while(--n)
{
cin>>price;
if(differ<price-minprice)
differ=price-minprice;
if(minprice>price)
minprice=price;
}
cout<<differ;
return 0;
}
問題 E: 統計字數
思路
有手就行。讀入一行字元,所以用了getline(cin,s);
程式碼
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
int e=0,n=0;
getline(cin,s);
for(int i=0;i<s.size();++i){
if(s[i]>='a'&&s[i]<='z' || s[i]>='A'&&s[i]<='Z')
++e;
if(s[i]>='0'&&s[i]<='9')
++n;
}
cout<<e<<" "<<n;
return 0;
}
問題 F: 整數拆分
思路
取子串,有點類似第八場的E題,但是主要特判首位置為 0 的情況。其他基本就是string類函式的呼叫,不會的去學c++——string類基礎詳解
程式碼
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
int e=0,n=0;
getline(cin,s);
for(int i=0;i<s.size();++i){
if(s[i]>='a'&&s[i]<='z' || s[i]>='A'&&s[i]<='Z')
++e;
if(s[i]>='0'&&s[i]<='9')
++n;
}
cout<<e<<" "<<n;
return 0;
}
問題 I: 數列計算VI
思路
開一個數組,每一個數都是它前面相鄰四個數字之和的個位數字.
程式碼
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int ans=0,a[20];
a[0]=1;
a[1]=9;
a[2]=8;
a[3]=7;
for(int i=4;i<n;++i)
a[i]=(a[i-1]+a[i-2]+a[i-3]+a[i-4])%10;
for(int i=0;i<n;++i)
{
cout<<a[i]<<" ";
ans += a[i];
}
cout<<endl<<ans;
return 0;
}
問題 J: 海淀排序
思路
開陣列,寫個cmp(從大到小)sort快排,比較,輸出下標。
程式碼
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,m;
cin>>n;
int a[16];
for(int i=1;i<=n;++i)
cin>>a[i];
sort(a+1,a+n+1,cmp);
cin>>m;
for(int i=1;i<=n;++i)
if(m>=a[i])
{
cout<<i;
break;
}
return 0;
}
問題 K: 猜數
思路
三位數拆分,遍歷。
程式碼
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
cin>>n;
int ans,a=0,b=0,c=0;;
int ge,shi,bai;
for(int i=1;i<=n;++i)
{
ge=i%10;
shi=(i%100)/10;
bai=i/100;
if(ge==2)
++a;
if(shi==2)
++b;
if(bai==2)
++c;
}
ans = a+b+c;
cout<<ans;
return 0;
}
問題 L: Haiku
思路
有手就行,這篇可能是考英文(英文題目,嗚嗚嗚)。
程式碼
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
for(int i=0;i<s.size();++i)
if(s[i]==',')
s[i]=' ';
cout<<s;
return 0;
}
問題 M: Sum of Three Integers
思路
同樣也是英文題目,有點像c語言課後題,最直接的三個for迴圈,暴力解,但是在這裡會時間超限(別問我為啥知道,問就是我已幹過了),所以我們需要優化掉最後一層迴圈。
程式碼
#include <bits/stdc++.h>
using namespace std;
int main()
{
int k,s;
int i,j,l;
cin>>k>>s;
long long count=0;
for(i=0;i<=k;++i)
for(j=0;j<=k;++j)
if(s-i-j>=0&&s-i-j<=k)
++count;
cout<<count;
return 0;
}