常州大學新生寒假訓練會試
阿新 • • 發佈:2018-12-23
A新增逗號
題目描述
對於一個較大的整數 N(1<=N<=2,000,000,000) 比如 980364535,我們常常需要一位一位數這個數字是幾位數,但是如果在這 個數字每三位加一個逗號,它會變得更加易於朗讀。 因此,這個數字加上逗號成如下的模樣:980,364,535請寫一個程式幫她完成這件事情輸入描述:
一行一個整數 N
輸出描述:
一行一個字串表示新增完逗號的結果示例1
輸入
980364535
輸出
980,364,535
備註:
1≤n≤2,000,000,000
思路:
用字元陣列儲存,注意,注意,注意,要從後往前數,每三個數輸出一個“,”,一開始直接就從前面數,然後輸出,wa了三發。。。真的是水(QAQ)
程式碼:
#include<map> #include<vector> #include<queue> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define maxn 4000 #define PI acos(-1.0) #define INF 1e9 using namespace std; typedef long long ll; int main() { char s[10000]; cin>>s; int len=strlen(s); int sum=1; //int ans=0; string ss=""; for(int i=len-1;i>=0;i--){ if(sum==3&&i!=0){ ss=ss+s[i]+","; sum=1; } else{ ss=ss+s[i]; sum++; } } for(int i=ss.length()-1;i>=0;i--) cout<<ss[i]; cout<<endl; return 0; }
B對稱
思路:
題目描述
萌新AA喜歡對稱,最近她喜歡把棋子放進她的棋盤中,這個棋盤是由 N×M 個格 子構成的(1 <= N <= 1,000,000,000;1<=M<=1,000,000,000) 為了保證對稱,AA 會以這樣的方式擺放她的棋子。她把棋子放在棋盤正中央的方格內, 如果不存在這樣的方格,她就會停止。然後她以這個方格為中心把棋盤分成四部分,然後對於每 個小棋盤進行上述的操作。 下面是一個 N=7,M=15 的例子,其中'C'表示棋子這樣子,需要 21個棋子。如果 N=M=5 的話,AA只需要擺放一個棋子,因為分成的四 個小棋盤分別是 2×2 的大小,無法在放進去新的棋子。現在,請你幫助 AA來計算,需要 多少個棋子。
輸入描述:
一行兩個整數 N,M
輸出描述:
一行一個整數,即需要的棋子數示例1
輸入
7 15
輸出
21示例2
輸入
3 1
輸出
1
說明
不一定變成4個部分,存在中心位置即可
備註:
1≤n,m≤1,000,000,000。
一開始按照規律找,找了好久...其實只有全是奇數的時候才可能存在棋子,然後看他給的樣例,沒找到一次(點數-1)/2,然後數量是增加上次增加的4倍;
程式碼:
#include<map>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 5000+100
#define PI acos(-1.0)
#define INF 1e9
using namespace std;
typedef long long ll;
int main()
{
ll n,m;
while(cin>>n>>m){
int sum=0;
int ans=1;
while(true){
if((n&1)&&(m&1)){
sum=sum+ans;
ans=ans*4;
}
else break;
n=(n-1)/2;
m=(m-1)/2;
}
cout<<sum<<endl;
}
return 0;
}
C競賽技巧
題目描述
在ACM競賽中,當遇到有兩個隊伍(人) 解出相同的題目數量的時候,我們需要通過他們解決問題的總時間進行排序。 一共有 N(1<=N<=5,000)條時間被以時(0<=Hours<=99), 分(0<=Minutes<=59),秒(0<=Seconds<=59)的形式記錄。 你必須要把他們按時,分,秒排序為 升序,最少的時間最先。 考慮到如下的樣例,這三個解出相同題目數量的時間為 11:20:20 11:15:12 14:20:14 正確的排序結果應該是這樣的: 11:15:12 11:20:20 14:20:14輸入描述:
第 1 行,一個整數 N 第 2~n+1 行,每行 3 個整數,表示時,分,秒
輸出描述:
共 n 行,每行 3 個整數,表示排序完後的結果示例1
輸入
3 11 20 20 11 15 12 14 20 14
輸出
11 15 12 11 20 20 14 20 14
說明
所以在保證能做對的情況下,我們應當儘量減少罰時
思路:運用結構體,然後sort排序,注意自己定義比較方式
程式碼:
#include<map>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 5000+100
#define PI acos(-1.0)
#define INF 1e9
using namespace std;
typedef long long ll;
struct Node{
int h;
int t;
int s;
}node[maxn];
bool cmp(Node a,Node b){
if(a.h==b.h&&a.t==b.t) return a.s<b.s;
if(a.h==b.h) return a.t<b.t;
else return a.h<b.h;
}
int main()
{
int n;
while(cin>>n){
for(int i=0;i<n;i++){
cin>>node[i].h>>node[i].t>>node[i].s;
}
sort(node,node+n,cmp);
for(int i=0;i<n;i++){
cout<<node[i].h<<" "<<node[i].t<<" "<<node[i].s<<endl;
}
}
return 0;
}
E這是一個數學題
題目描述
已知有一個n+1個數的數列,對於給定的A0和An ,當i滿足當1<=i<=n-1時有現在小星想知道對於這個數列一段區間的和。
輸入描述:
第一行輸入四個數 n,A0,An,Q接下來Q行 每行輸入兩個數l,r0=< n,A0,An<=1e9,Q<=1000000<=l<=r<=n
輸出描述:
對於每組查詢輸出Al到Ar的和
示例1
輸入
3 0 3 2 1 1 1 3
輸出
1 6
備註:
為了對萌新表現出友好,資料保證了對於Ai的每一項都是整數
思路:其實關鍵部分就是要對其進行化簡,然後你就會發現他是一個等比數列,化簡後的式子為:ai=a0+((an-a0)/n)*i;可以發現是一個等差數列,然後運用求和公式(當成梯形求面積的那個公式)
程式碼:
#include<map>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 5000+100
#define PI acos(-1.0)
#define INF 1e9
using namespace std;
typedef long long ll;
int main()
{
int n,a0,an,Q;
int l,r;
cin>>n>>a0>>an>>Q;
for(int i=1;i<=Q;i++){
cin>>l>>r;
ll s1=a0+((an-a0)/n)*l;
ll s2=a0+((an-a0)/n)*r;
ll sum=((s1+s2)*(r-l+1))/2;
cout<<sum<<endl;
}
return 0;
}
G零下e度
題目描述
在家好冷! 又多冷呢? 大概是零下e度! 為什麼是零下e度呢? 不知道,因為我編不下去了。 求給定一個數n,求出最接近n!/e的整數輸入描述:
一行一個整數n
1<=n<=10^8
輸出描述:
一行一個整數,即題目描述中所求,由於這個數字可能很大,我們只需要知道mod 998244353後的結果(出題人負責任地告訴你,這個數字是個質數)示例1
輸入
6
輸出
265示例2
輸入
87
輸出
158005593示例3
輸入
16777216
輸出
16065816
看的大佬的,日後再議。。。
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<string>
#define ll long long
using namespace std;
const ll mo=998244353;
const double e=2.71828;
int main(){
ll n,i;
while (scanf("%lld",&n)!=EOF){
if (n<=3){
ll ans=1;
for (i=1;i<=n;i++){
ans*=i;
}
cout<<int(ans/e)<<endl;
}
else {
ll ans=0;
ll fun=1;
ll temp;
if (n%2){
temp=1;
ans=-1;
}
else {
temp=-1;
ans=1;
}
for (i=n;i>=3;i--){
fun=fun*i%mo;
ans=(ans+temp*fun)%mo;
temp=-temp;
}
cout<<(ans+mo)%mo<<endl;
}
}
return 0;
}
H酸鹼滴定
題目描述
有時候你會抱怨,什麼時候才能到終點。 有時候你會迫不及待,怎麼顏色還不改變。 滴定管長場的,我們的路長長的。 用心的放入每一滴,終點就在你手心。 今天小星需要去完成一個酸鹼滴定實驗。,實驗室老師要求用 A mol/L 的HCL去測定一瓶NaOH的濃度。首先小星取出了一個錐形瓶,在裡面放入的Bml的NaOH,並滴加1-2滴甲基橙,然後用HCL去滴定他 當滴定至恰好變為紅色時(可以認為H離子濃度等於OH離子濃度),用了C ml 小星現在需要計算NaOH的濃度是多少?單位(mol/L) 對於濃度採用化學裡“四捨六入五成雙”方法保留2位小數 規則1 :第三位小數≤4 時捨去 規則2: 第三位小數≥6時進上 規則3: 第三位小數等於5時 3.1首先根據 5後面的數字來定,當5後有數時,舍5入1; 3.2當5後無有效數字時,需要分兩種情況來講: 3.2.1 5前為奇數,舍5入1; 3.2.2 5前為偶數,舍5不進(0是偶數) 例如9.8249=9.82 規則1 9.82671=9.83 規則2 9.82501=9.83 規則3.1
9.8351 =9.84 規則3.1 9.8350=9.84 規則3.2.1 9.8250=9.82 規則3.2.2
輸入描述:
輸入第一行一個數T(T<=20)表示資料組數
對於每組資料輸入 A,B,C三個3位小數
0.000<a,b,c<50.000
輸出描述:
結果“四捨六入五成雙”保留2位小數示例1
輸入
3 10.000 10.000 1.825 10.000 10.000 9.835 1.010 21.325 19.823
輸出
1.82 9.84 0.94
說明
樣例1中計算出的結果為 1.8250000000根據(規則3.2.2) 答案應該為1.82
9.835->9.84(規則3.2.1)
思路:
就是判斷,感覺這個題目有毒。。。貌似是銀行家舍入法,用的Java,怎麼都不對。。。
AC程式碼:
#include<map>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 5000+100
#define PI acos(-1.0)
#define INF 1e9
using namespace std;
typedef long long ll;
double aa,bb,cc,cf,xx;
ll x;
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf",&aa,&bb,&cc);
cf=aa*cc/bb*10000;
xx=aa/bb*cc*1000000000;
int ab,b,c,d;
ab=cf;
x=xx;
b=ab%10;
c=ab/10%10;
d=ab/100%10;
if(c<5||c>5)printf("%.2f\n",cf/10000);
else
{
if(d%2||x%1000000>0)
printf("%.2f\n",(ab/10+1)*1.0/1000);
else
printf("%.2f\n",ab/100*1.0/100);
}
}
}
I合成反應
題目描述
有機合成是指從較簡單的化合物或單質經化學反應合成有機物的過程。 有時也包括從複雜原料降解為較簡單化合物的過程。 由於有機化合物的各種特點,尤其是碳與碳之間以共價鍵相連,有機合成比較困難,常常要用加熱、光照、加催化劑、加有機溶劑甚至加壓等反應條件。 但是前人為有機合成提供了許多寶貴的經驗。 現在已知有K總物質和N個前人已經總結出的合成反應方程式 小星想知道在現有M種物質的情況下 能否合成某些物質。輸入描述:
第一行輸入四個整數 K,N,M,Q(K,N,M,Q<=1e5)
K表示一共K總物質
接下來N行 每行三個數字a b c(任意兩個數可能相等)
表示a和b反應可以生成c 反應是可逆的
即可以通過c可以分解出a和b
接下來一行行然後輸入m個數,表示m種原料(每一種原料都可以認為有無限多)
接下來Q個行Q個詢問
對於每個詢問
輸出一個數字 x 判斷是否可以通過一些反應得到第 x
輸出描述:
可以得到Yes否則No示例1
輸入
10 3 4 10 1 2 3 4 5 6 2 5 7 3 4 5 8 1 2 3 4 5 6 7 8 9 10
輸出
Yes Yes Yes Yes Yes Yes Yes Yes No No
說明
一共10總物質有第3,4,5,8 四種原料
查詢每一種是否可以通過反應得到
首先通過3可以分解得到1 2
然後4 5合成6
2 5合成7
於是除了9 10都可以得到
思路:
就是跑一邊,然後記錄已知的點進入集合,由集合中的點退出心點,將新推出的點加入集合,直至不能再加入點時為止。
程式碼:
#include<bits/stdc++.h>
int a[100005],b[100005],c[100005];
bool mp[100005];
using namespace std;
int main()
{
int K,N,M,Q;
scanf("%d%d%d%d",&K,&N,&M,&Q);
int i,j;
for(i=1;i<=N;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
}
memset(mp,0,sizeof(mp));
for(i=1;i<=M;i++)
{
int x;
scanf("%d",&x);
mp[x]=1;
}
bool bb=1;
while(bb)
{
bb=0;
for(i=1;i<=N;i++)
{
int x=a[i],y=b[i],z=c[i];
if(mp[x]&&mp[y]&&!mp[z])
{
mp[z]=1;
bb=1;
}
if(mp[z]&&(!mp[x]||!mp[y]))
{
mp[x]=1;
mp[y]=1;
bb=1;
}
}
}
while(Q--)
{
int x;scanf("%d",&x);
if(mp[x])printf("Yes\n");
else printf("No\n");
}
return 0;
}
J同分異構體
題目描述
化學上,同分異構體是一種有相同分子式而有不同的原子排列的化合物。簡單地說,化合物具有相同分子式,但具有不同結構的現象,叫做同分異構現象;輸入一個數n,求n個碳的烷烴(僅由碳、氫、碳碳單鍵與碳氫單鍵所構成)的同分異構體的數目n=3,4,5如下圖所示
輸入描述:
輸入一個數n(n<=9)
輸出描述:
一個整數表示答案示例1
輸入
3
輸出
1示例2
輸入
4
輸出
2示例3
輸入
5
輸出
3
備註:
這裡不考慮空間異構
思路:不知道出題人出這道題的目的何在,考化學??
程式碼:
#include<map>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 4000
#define PI acos(-1.0)
#define INF 1e9
using namespace std;
typedef long long ll;
int main()
{
int n;
int a[]={1,1,1,2,3,5,9,18,35};
while(cin>>n){
cout<<a[n-1]<<endl;
}
return 0;
}
思路