天天看點

【NOIP-普及組-複賽】(3)NOIP2012普及組複賽題解

**這隻是一個作業,如果有幫到您的,我隻能說。。。這不科學。。。 **

————————————華麗的分割線————————————

第一題:

【NOIP-普及組-複賽】(3)NOIP2012普及組複賽題解

第一個想法:用最基礎的找質數思路解

資料範圍太大,int級,怎麼辦。。。。

正解與暴力隻差幾個字元。。。搜尋隻搜到sqrt就行了。。。

貼代碼~~~

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <queue>
#include <map>
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;i<b;i++)
using namespace std;

int a;
int main()
{
	int i;
	
	scanf("%d",&a);
	for(i=sqrt(a);;i--)
	if(!(a%i)){printf("%d",a/i);return 0;}
}
//沒有什麼是兩個巴掌不能解決的,如果有就再來兩個巴掌
           

————————————華麗的分割線————————————

第二題:

【NOIP-普及組-複賽】(3)NOIP2012普及組複賽題解
【NOIP-普及組-複賽】(3)NOIP2012普及組複賽題解

先吐槽一下:這題目真心長啊。。。

不過還是按照以往的慣例:暴力

首先從第一層開始,按照規則模拟累加,一直到頂層,輸出;

可是這有n層,每層要循環x次,O(nx)絕對絕對過不了。

怎麼辦?這時就要用上我們暴力的好幫手:縮小範圍了

我們可以在輸入時先算出每層有樓梯的房間的個數。

然後把每個x膜(模)這個數。

然後就O(nm)了

(這題本來想用線上算法的可這惡心的輸入把最重要的資訊放最後。。。)

下面代碼醬:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <queue>
#include <map>
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;i<b;i++)
using namespace std;

int n,m,nowm,ans,poi[10086][110],add[10086];
bool sta[10086][110];
int main()
{
	int i,j,k;
	
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		for(j=0;j<m;j++)
		{
			scanf("%d%d",&sta[i][j],&poi[i][j]);
			add[i]+=sta[i][j];
		}
	scanf("%d",&nowm);
	for(i=1;i<=n;i++)
	{
		ans=(ans+poi[i][nowm])%20123;
		k=poi[i][nowm],k=(k-1)%add[i]+1;
		while(k)if(k-=sta[i][nowm])nowm=(nowm+1)%m;
	}
	printf("%d\n",ans);
	return 0; 
}
//沒有什麼是兩個巴掌不能解決的,如果有就再來兩個巴掌
           

對了還有一件事就是這題坑很多

下面是坑的總結(由

————————————華麗的分割線————————————

第三題:

【NOIP-普及組-複賽】(3)NOIP2012普及組複賽題解

一道dp

狀态:f[i][j]表示就擺前i種花共j盆的方案數

狀态轉移方橙:

f[i][j]=(f[i][j]+f[i-1][j-k])%1000007|k=0~min(a[i]>j)

代碼:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <queue>
#include <map>
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;i<b;i++)
using namespace std;

ci MAXN=110;
int n,m,a[MAXN],f[MAXN][MAXN]; 
int main()
{
	int i,j,k,l;
	
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)scanf("%d",&a[i]);
    f[0][0]=1;
 //   cout<<n<<" "<<m<<endl;
    for(i=1;i<=n;i++)  
        for(j=0;j<=m;j++)  
        {  
            l=a[i]>j?j:a[i];  
            for (k=0;k<=l;++k)f[i][j]=(f[i][j]+f[i-1][j-k])%1000007;
//			cout<<n<<" "<<m<<endl;  
        }  
    printf("%d",f[n][m]);
    return 0;    
}  
//沒有什麼是兩個巴掌不能解決的,如果有就再來兩個巴掌
           

————————————華麗的分割線————————————

第四題:

【NOIP-普及組-複賽】(3)NOIP2012普及組複賽題解
【NOIP-普及組-複賽】(3)NOIP2012普及組複賽題解

文化之旅。。。

做完這道題我沒文化了。

這道題AC的方法有很多(話說我為啥不寫正解有很多呢)

比如說我就是Floyd判是否排斥的。。。

不過這道題有個很惡心的地方。。。

就是這道題沒有正解。。。(明白了把qwq)

當年

看到洛谷上有人寫A*。、。

也錯了。,。

————————————華麗的分割線————————————

今天洛谷大吉好開森~~~