嫣然一笑II
【問題描述】(模擬)
一張長度為N的紙帶,我們可以從左至右編號為0 ? N(紙帶最左端 標號為
0) 。 現在有M次操作, 每次將紙帶沿著某個位置進行折疊, 問所有操作之后紙帶
的長度是多少。
【輸入格式】
第一行兩個數字N,M如題意所述。
接下來一行M個整數代表每次折疊的位置。
【輸出格式】
一行一個整數代表答案。
【樣例輸入】
5 2
3 5
【樣例輸出】
2
【樣例解釋】
樹上有只鳥。
【數據規模與約定】
對于60%的數據,N,M ≤ 3000。
對于100%的數據,N≤ 10^18, M≤ 3000。
題解:
#include<iostream> #include<cstdio> using namespace std; long long a[50005]; int main() {long long n,m;scanf("%lld%lld",&n,&m);for(int i=1;i<=m;i++){scanf("%lld",&a[i]);}long long r=n;for(int i=1;i<=m;i++){for(int j=i+1;j<=m;j++){if(a[j]<=a[i]){a[j]=a[i]+a[i]-a[j];}}r=max(a[i]+a[i],r);for(int j=i+1;j<=m;j++){a[j]-=a[i];}r-=a[i];}printf("%lld",r);return 0; }————————————————–我是華麗的分割線—————————————————–
無向圖找環
Description
給你一副無向圖,每條邊有邊權,保證圖聯通,現在讓你判斷這個圖是否滿足任意一個環的邊權異或和為0。
Input
多組測試數據,先輸入一個數字T,T組每組先輸入兩個數n m,表示圖的點跟邊的數量。
然后是m行,每行三個數a b c。代表一條邊的起點,終點,邊權。
Input
多組測試數據,每組先輸入兩個數n m,表示圖的點跟邊的數量。
然后是m行,每行三個數a b c。代表一條邊的起點,終點,邊權。
1 <= n<= 100, 1 <= m <= 100.
1 <= a <= n, 1 <= b <= n, a != b.
0 <= c <= 2^16-1
Output
對于每組數據輸出Yes或者 No(若滿足輸出Yes,不存在輸出No)。
Sample Input
3 3
1 2 0
2 3 1
3 1 1
Sample Output
Yes
題解(dfs):
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=505; struct cc{int from,to,cost; }es[maxn]; int first[maxn],next[maxn]; int tot=0; void build(int ff,int tt,int pp) { es[++tot]=(cc){ff,tt,pp}; next[tot]=first[ff]; first[ff]=tot; } int vis[maxn]; int dis[maxn]; bool flag; void dfs(int x) {for(int i=first[x];i;i=next[i]){int u=es[i].to;if(!vis[u]){vis[u]=1;dis[u]=dis[x]^es[i].cost;dfs(u);}else {if((dis[x]^dis[u]^es[i].cost )!=0){flag=1;return ;}}} } void init() {memset(dis,0,sizeof(0));memset(vis,0,sizeof(vis));memset(es,0,sizeof(es));memset(first,0,sizeof(first));memset(next,0,sizeof(next));flag=0; } int main() {int T;scanf("%d",&T);while(T--){init();int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);build(x,y,z);build(y,x,z);}for(int i=1;i<=n;i++){if(!vis[i]){vis[i]=1;dfs(i); }}if(flag){printf("No\n"); }else{printf("Yes\n"); }} return 0; }——————————————————我是華麗的分割線——————————————————
完美的序列(sequence)
Time Limit:1000ms Memory Limit:64MB
題目描述
LYK 認為一個完美的序列要滿足這樣的條件:對于任意兩個位置上的數都不相同。然而
并不是所有的序列都滿足這樣的條件。
于是 LYK 想將序列上的每一個元素都增加一些數字(當然也可以選擇不增加),使得整個
序列變成美妙的序列。
具體地, LYK 可以花費 1 點代價將第 i 個位置上的數增加 1,現在 LYK 想花費最小的代價
使得將這個序列變成完美的序列。
輸入格式(sequence.in)
第一行一個數 n,表示數字個數。
接下來一行 n 個數 ai 表示 LYK 得到的序列。
輸出格式(sequence.out)
一個數表示變成完美的序列的最小代價。
輸入樣例
4
1 1 3 2
輸出樣例
3
數據范圍
對于 30%的數據 n<=5。
對于 60%的數據 n<=1000。
對于 80%的數據 n<=30000,ai<=3000。
對于 100%的數據 n<=100000,1<=ai<=100000。
題解(排序?!):
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int a[300005]; int main() {int n;scanf("%d",&n);for(int i=1;i<=n;i++){int x;scanf("%d",&x);a[x]++;}int ans=0;for(int i=1;i<=300000;i++){if(a[i]>1){ans+=a[i]-1;a[i+1]+=a[i]-1;}}printf("%d",ans);return 0; }—————————————————我是華麗的分割線——————————————————-
LYK 與實驗室(lab)
Time Limit:5000ms Memory Limit:64MB
題目描述
LYK 在一幢大樓里,這幢大樓共有 n 層,LYK 初始時在第 a 層上。
這幢大樓有一個秘密實驗室,在第 b 層,這個實驗室非常特別,對 LYK 具有約束作用,
即若 LYK 當前處于 x 層,當它下一步想到達 y 層時,必須滿足|x-y|<|x-b|,而且由于實驗室
是不對外開放的,電梯無法停留在第 b 層。
LYK 想做一次旅行,即它想按 k 次電梯,它想知道不同的旅行方案個數有多少個。
兩個旅行方案不同當前僅當存在某一次按下電梯后停留的樓層不同。
輸入格式(lab.in)
一行 4 個數,n,a,b,k。
輸出格式(lab.out)
一個數表示答案,由于答案較大,將答案對 1000000007 取模后輸出。
輸入樣例 1
5 2 4 1
輸出樣例 1
2
輸入樣例 2
5 2 4 2
輸出樣例 2
2
輸入樣例 3
5 3 4 1
輸出樣例 3
0
數據范圍
對于 20%的數據 n,k<=5。
對于 40%的數據 n,k<=10。
對于 60%的數據 n,k<=500。
對于 90%的數據 n,k<=2000。
對于 100%的數據 n,k<=5000。
題解(dp):
#include<iostream> #include<cstdio> using namespace std; const int mod=1000000007; long long dp[5005],sum[5005]; int main() { int n,a,b,k;qscanf("%d%d%d%d",&n,&a,&b,&k); dp[a]=sum[a]=1;int ans=0;for(int i=a+1;i<=n;i++){sum[i]=1;//前綴和 }for(int i=1;i<=k;i++){for(int j=1;j<=n;j++){if(j<b)//實驗室下半部分到不了實驗室上方 {dp[j]=(sum[(j+b-1)/2]-sum[j]+sum[j-1]+mod)%mod;}if(j>b)//實驗室上半部分到不了實驗室下方 {dp[j]=(sum[n]-sum[(j+b)/2]+mod-sum[j]+sum[j-1]+mod)%mod; }if(j==b){dp[j]=0;//實驗室不能到達}}for(int j=1;j<=n;j++){sum[j]=(sum[j-1]+dp[j])%mod;//前綴和 }}for(int i=1;i<=n;i++){ans=(ans+dp[i])%mod;//統計 }printf("%d",ans);return 0; }轉載于:https://www.cnblogs.com/-feather/p/7779901.html
總結
- 上一篇: [LeetCode] Reverse L
- 下一篇: git服务的安装和使用