套题T4
?
Problem 1 無聊的gcd(gcd.c/cpp/pas)
話說出題人不會被查水表吧。
簡單的問題描述:從N個正整數(shù)里面取出K個數(shù)的最大公因數(shù)最大是多少。(請將答案乘上k之后輸出哦,謝謝合作。)
輸入格式
第一行兩個正整數(shù)N,K。
第二行n個正整數(shù)
輸出格式
輸出一個正整數(shù)表示最大的最大公因數(shù)。
樣例輸入
3 1
1 2 3
樣例輸出
????3
數(shù)據(jù)說明
對于30%的數(shù)據(jù),保證k≤n≤20。
對于50%的數(shù)據(jù),保證輸入中所有數(shù)小于5000。
對于100%的數(shù)據(jù),保證輸入中所有數(shù)小于500000,k≤n。
?
0表示不取 1表示取
用i的二進制表示狀態(tài) ?比如i=10101表示取1,3,5? ??i=00110表示取3,4
然后for一遍,tmp表示i的二進制當中1的數(shù)量如果1有k個
那么i代表的狀態(tài)選了k個數(shù)
for一遍把i表示的狀態(tài)取了的數(shù)的gcd取出來
最后統(tǒng)計ans?
#include <cstdio> #include<iostream> using namespace std; const int Maxn = 40;int a[Maxn],n,k,ans=0;int gcd(int a,int b) {return b ? gcd(b,a%b) : a; }int max(int a,int b) {return a < b ? b : a ; }int main() {scanf("%d%d",&n,&k);for(int i=0;i<n;++i)scanf("%d",&a[i]);//讀入 for(int i=1;i<(1<<n);++i) {int tmp = 0;for(int j=0;j<n;++j) {if(i&(1<<j)) ++tmp;//tmp表示選了幾個數(shù) } // printf("i = %d : tmp = %d\n",i,tmp);if(tmp==k)//如果選了k個 {tmp=-1;for(int j=0;j<n;++j) {if(i&(1<<j)) {if(tmp==-1) tmp=a[j];else tmp=gcd(a[j],tmp);}}ans = max(ans,tmp); // printf("ans : %d\n",ans); }}printf("%d",ans*k);puts("");return 0; } QAQ數(shù)論好煩啊?
如果i&(1<<j)?==?1的話那么i的第j位就是1?
因為1<<j是...001000...的形式存在,所以和 i 與起來,要是 i 這一位是 1 , 就是1,i 這一位是0,就是0
?所以 i&(1<<j) 表示 i 在二進制下的第 j 位
?
?因為1<<0?=?1?這時候j=0?如果從1存的話就變成1<<1?=?2?那就時間復(fù)雜度*2 所以從0開始讀
?
?
首先所有輸入數(shù)字不大于50W,那么我們開一個50W的數(shù)組,記下每個數(shù)字出現(xiàn)多少次
然后就有一些有意思的事情發(fā)生了
我們從小到大枚舉答案?每個答案x,判定可行的方法就是遍歷每一個x的倍數(shù)
那么只要把所有x的倍數(shù)統(tǒng)計一下有多少看看是不是大于等于k就好了
如果我選的是這k個x的倍數(shù),那么我們不就知道答案至少是x了
?
?
?
?
?
?
?
?
?
?
Problem 2 蟲洞(wormhole.cpp/c/pas)
【題目描述】
John在他的農(nóng)場中閑逛時發(fā)現(xiàn)了許多蟲洞。蟲洞可以看作一條十分奇特的有向邊,并可以使你返回到過去的一個時刻(相對你進入蟲洞之前)。John的每個農(nóng)場有M條小路(無向邊)連接著N (從1..N標號)塊地,并有W個蟲洞(有向邊)。其中1<=N<=500,1<=M<=2500,1<=W<=200。 現(xiàn)在John想借助這些蟲洞來回到過去(出發(fā)時刻之前),請你告訴他能辦到嗎。 John將向你提供F(1<=F<=5)個農(nóng)場的地圖。沒有小路會耗費你超過10000秒的時間,當然也沒有蟲洞回幫你回到超過10000秒以前。
【輸入格式】
* Line 1: 一個整數(shù) F, 表示農(nóng)場個數(shù)。
* Line 1 of each farm: 三個整數(shù) N, M, W。
* Lines 2..M+1 of each farm: 三個數(shù)(S, E, T)。表示在標號為S的地與標號為E的地中間有一條用時T秒的小路。
* Lines M+2..M+W+1 of each farm: 三個數(shù)(S, E, T)。表示在標號為S的地與標號為E的地中間有一條可以使John到達T秒前的蟲洞。
【輸出格式】
* Lines 1..F: 如果John能在這個農(nóng)場實現(xiàn)他的目標,輸出"YES",否則輸出"NO"。
【樣例輸入】
2
3 3 1
1 2 2
1 3 4
2 3 1
3 1 3
3 2 1
1 2 3
2 3 4
3 1 8
【樣例輸出】
NO
YES
?
1.一個點如果經(jīng)過一個環(huán)以后dis一直在變小,那么顯然這個環(huán)是負環(huán)
2.如果沒有負環(huán)一個點最多進隊n次(每條只想j的邊都維護一遍dis)
所以vis記成int,int?vis[Maxn];
while(!q.empty())??
?
?
?
?
?
?
?
?
?
?
?
Problem 3 機器人(robot.cpp/c/pas)
【題目描述】
早苗入手了最新的Gundam模型。最新款自然有著與以往不同的功能,那就是它能夠自動行走,厲害吧。
早苗的新模型可以按照輸入的命令進行移動,命令包括‘E’、‘S’、‘W’、‘N’四種,分別對應(yīng)東南西北。執(zhí)行某個命令時,它會向?qū)?yīng)方向移動一個單位。作為新型機器人,它可以執(zhí)行命令串。對于輸入的命令串,每一秒它會按命令行動一次。執(zhí)行完命令串的最后一個命令后,會自動從頭開始循環(huán)。在0時刻時機器人位于(0,0)。求T秒后機器人所在位置坐標。
【輸入格式】
第1行:一個字符串,表示早苗輸入的命令串,保證至少有1個命令
第2行:一個正整數(shù)T
【輸出格式】
2個整數(shù),表示T秒時,機器人的坐標。
【樣例輸入】
NSWWNSNEEWN
12
【樣例輸出】
-1 3
【數(shù)據(jù)范圍】
對于60%的數(shù)據(jù) T<=500,000 且命令串長度<=5,000
對于100%的數(shù)據(jù) T<=2,000,000,000 且命令串長度<=5,000
?
【注意】
向東移動,坐標改變改變?yōu)?/span>(X+1,Y);
向南移動,坐標改變改變?yōu)?/span>(X,Y-1);
向西移動,坐標改變改變?yōu)?/span>(X-1,Y);
向北移動,坐標改變改變?yōu)?/span>(X,Y+1);?
?
?由于t特別大然后操作序列最長只有5000
?
?就先做一遍操作序列,看看做完一整個序列之后,x和y是變化量是多少,并記錄這個變化量
用t除以長度,剩下的就是取模了就是t%長度??就知道要做到哪里了
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; char ch[5005]; int t,nn=0; int xx=0,yy=0; int x=0,y=0; int main() {scanf("%s%d",ch+1,&t);int n=strlen(ch+1);for(int i=1;i<=n;++i){if(ch[i]=='N')yy++;if(ch[i]=='S')yy--;if(ch[i]=='W')xx--;if(ch[i]=='E')xx++;}nn=t/n;t%=n;for(int i=1;i<=t;++i){if(ch[i]=='N')y++;if(ch[i]=='S')y--;if(ch[i]=='W')x--;if(ch[i]=='E')x++;}cout<<x+xx*nn<<" "<<y+yy*nn;puts("");return 0; } 模擬也要動腦子QAQ?
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/gc812/p/5837588.html
總結(jié)
- 上一篇: mysql索引的使用和优化
- 下一篇: Linux基础三剑客