1. 程式人生 > >常州大學新生寒假訓練會試

常州大學新生寒假訓練會試

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;
}

思路