Codeforces Round #587 (Div. 3)

A

只要每兩個都不一樣就可以,一旦出現兩個一樣的就改一個。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cctype>
#include<queue>
#include<set>using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=2e5+5;
int n,ans;
char s[MAXN];int main()
{while(~scanf("%d",&n)){ans=0;scanf("%s",s);for(int i=0;i<n;i+=2){if(s[i]=='a'){if(s[i+1]=='a'){s[i+1]='b';ans++;}}else{if(s[i+1]=='b'){s[i+1]='a';ans++;}}}printf("%d\n%s\n",ans,s);}return 0;
}

B
就是一個排序

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cctype>
#include<queue>
#include<set>using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e3+5;struct node
{int idx,p;
}a[MAXN];
int n;
int ans;bool cmp(const node&a,const node&b)
{return a.p>b.p;
}int main()
{while(~scanf("%d",&n)){ans=0;for(int i=1;i<=n;i++){a[i].idx=i;scanf("%d",&a[i].p);}sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){ans+=(i-1)*a[i].p+1;}printf("%d\n",ans);for(int i=1;i<n;i++){printf("%d ",a[i].idx);}printf("%d\n",a[n].idx);}return 0;
}

C

題目的意思很好理解,就是有點小繁瑣。就是一張白紙兩張黑紙,問黑紙會不會把白紙完全蓋住。
這個問題我們不能直接暴力進行判斷,我們首先要進行分析。
蓋不住的情況有很多種,但是蓋住的情況是可以分析的。如果一張黑紙直接將白紙全部蓋住(四個角都蓋住),那就沒什么好說的了。
如果存在一個角沒有被任何黑紙蓋住,顯然白紙是可以從上面看到的。
如果四個角都被黑紙蓋住了,我們首先分析,每張黑紙只能蓋住1,2,4個角,顯然不能只蓋住3個角。蓋住四個角的我們已經判斷過了,其中蓋住一個角還能保證四個角都被黑紙蓋住就說明另一張黑紙全部蓋住了,如果不是全部蓋住就是有角沒有蓋住,我們已經判斷過了,那么剩下的只能是兩張黑紙每張各占兩個角,而且還是相對的兩個角。
那么判斷能否被覆蓋的條件就很明了了:如果相對的這兩張黑紙有交集(或者恰好拼在一起)就是可以蓋住的,否則就是蓋不住的。
分別進行判斷。覺得可能是自己寫復雜了。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cctype>
#include<queue>
#include<set>using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;struct node
{int x,y;
}a[4];
int vis[4];int x1,x2,y1,y2;
int x3,x4,y3,y4;
int x5,x6,y5,y6;int main()
{while(~scanf("%d%d%d%d%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4,&x5,&y5,&x6,&y6)){if(x1>=x3 && y1>=y3 && x2<=x4 && y2<=y4 || x1>=x5 && y1>=y5 && x2<=x6 && y2<=y6){printf("NO\n");continue;}a[0].x=x1; a[0].y=y1;a[1].x=x1; a[1].y=y2;a[2].x=x2; a[2].y=y1;a[3].x=x2; a[3].y=y2;memset(vis,0,sizeof(vis));for(int i=0;i<4;i++){if(a[i].x>=x3 && a[i].y>=y3 && a[i].x<=x4 && a[i].y<=y4){vis[i]=1;}}for(int i=0;i<4;i++){if(a[i].x>=x5 && a[i].y>=y5 && a[i].x<=x6 && a[i].y<=y6){vis[i]=2;}}bool flag=true;for(int i=0;i<4;i++){if(!vis[i]){flag=false;break;}}if(!flag){printf("YES\n");}else{bool ok=false;if(vis[1]==vis[3]){if(vis[1]==1){if(y6>=y3)ok=true;}else{if(y4>=y5)ok=true;}}else{if(vis[1]==1){if(x4>=x5)ok=true;}else{if(x6>=x3)ok=true;}}if(ok){printf("NO\n");}else{printf("YES\n");}}}return 0;
}

D
我們用剩下最多的劍減去其他剩下的劍就可以得到至少拿走了多少劍。得到一個數列a1,a2,a3…an,這個數列里面肯定有一個是0,我們知道有一個結果肯定是t=gcd(a1,a2,a3…an),ans=a1/t+a2/t+a3/t+…+an/t。但是這個結果是不是最好的就不好說了,人家還可以每一個都多拿了一些,設為x,那么t=gcd(a1+x,a2+x,a3+x,…an+x),ans=(a1+x)/t+(a2+x)/t+…+(an+x)/t。x>=0。我們就在這些結果里面找最優解。
我們對這個結果進行觀察,結合最大公因數的一個式子:gcd(a,b)=gcd(a,a-b),設mina=min(a1+x,a2+x,…,an+x),那么t=gcd(a1+x-mina,a2+x-mina,…an+x-mina),這就退化成了最開始的情形,所以說,最開始的情形是最優解。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cctype>
#include<queue>
#include<set>using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=2e5+5;int n;
ll ans;
int a[MAXN],maxa;ll gcd(ll a,ll b)
{return b==0?a:gcd(b,a%b);
}int main()
{while(~scanf("%d",&n)){maxa=0; ans=0;for(int i=0;i<n;i++){scanf("%d",&a[i]);if(a[i]>maxa) maxa=a[i];}for(int i=0;i<n;i++){a[i]=maxa-a[i];}ll tmp=0;for(int i=0;i<n;i++){tmp=gcd(a[i],tmp);}for(int i=0;i<n;i++){ans+=a[i]/tmp;}printf("%lld %lld\n",ans,tmp);}return 0;
}

后面的三道題還沒有做出來。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383979.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信道分配 以太網

1.頻分復用 將信道分為多個頻帶, 用戶得到某個頻帶后,在通信的過程中, 自始至終都都占用這個信道.即頻分復用中, 所有用戶同時占用不同頻帶的信道 2. 時分信道 將時間劃分為一段一段的等長時分復用幀, 每個用戶在不同時間占用相同的數據幀 3. CSMA/CD 載波監聽多點接入/碰撞…

strpbrk函數

http://blog.csdn.net/tommy_wxie/article/details/7554332 函數原型&#xff1a;extern char *strpbrk(char *str1, char *str2) 參數說明&#xff1a;str1待比較的字符串&#xff0c;str2為指定被搜索的字符串。 所在庫名&#xff1a;#include <string.h> …

網絡層網絡層服務及其 IP 地址

ARP 協議功能 將 IP 地址通過廣播(一個網段, 不能跨路由器), 目標 MAC 地址是FFFFFFFF 解析目標IP地址的 MAC 地址. IP 協議 網絡層的一個協議, 是一個協議的統稱, 包括 ARP(地址解析協議) 協議, ICMP(網絡控制報文協議) 協議, IGMP(網際組管理協議) 協議. 其中 ICMP 和 IG…

隨機生成1024個數,存入一段內存,用指針實現獲取1024個數的最大數地址,最小數地址

http://blog.csdn.net/itcastcpp//details/39277193 題目&#xff1a;隨機生成1024個數&#xff0c;存入一段內存&#xff0c;用指針實現獲取1024個數的最大數地址&#xff0c;最小數地址&#xff0c;具體實現如下&#xff1a; [cpp] view plaincopy #include<stdlib.h> …

UVa11134

【題目分析】 覺得是一道挺考驗貪心掌握程度的題目&#xff0c;我就算知道是要用貪心而且肯定和區間有關&#xff0c;肯定要進行一下排序什么的我還是沒有找到合適的貪心策略。 經過大佬的博客后我才明白如何進行貪心。 如果沒有任何提示看這道題&#xff0c;首先&#xff0…

傳輸層:IP 地址解析 路由轉發

IP 地址與硬件地址 1. 地址解析 通過IP地址將其如何轉換為 MAC 地址.解決同一個局域網上的主機或路由的 IP 地址和硬件地址的映射問題. 即以太網上除了主機還有路由. 即如果發出的請求所有的主機都沒有做出相應, 那么該以太網上的路由會對其做出響應. (1) 以太網內部主機與…

UVa11582

一個數學問題,一旦出現循環確定循環節以后就能解決問題啦. 加上一個快速冪取模.需要注意的是數據范圍是264,所以必須用unsigned long long才能解決問題. 覺得板子還是要會自己寫,否則不同的題目具體有一些小的改變就會束手無策. 還有就是發現如果每次初始化數組的話就會超時,所…

輸入一個單向鏈表,輸出該鏈表中倒數第K個結點

http://blog.csdn.net/itcastcpp/article/details/39274891//尹成 單鏈表操作 #include <iostream> using namespace std; class LinkList;struct LinkNode { public:LinkNode(int value 0):m_value(value),pNext(NULL){}~LinkNode(){pNext NULL;}friend class LinkList…

網絡層:構成超網(CIDR)

CIDR構成超網 CIDR消除了原來的傳統的 A,B, C, D類地址, 使用了各種網絡前綴來代替原來分類地址中的網絡號和子網號, IP 地址由原來的三級分類又變成了兩級分類. 其中網絡號和子網號是一個隨機的長度. 其中 CIDR 也可以使用 / 的形式來表示, 其中在 / 前面寫上網絡前綴的位數.…

UVa12169

我們可以暴力枚舉a,然后通過x1和x3確定b的值&#xff0c;然后確定其他的數字&#xff0c;一旦出現錯誤就放棄這組解。 關鍵問題就在于如何通過a,x1,x3確定b的值 x2 ( x1 * a b) % M x3 ( x2 * a b ) % M ( ( x1 * a b ) % M * a b ) % M x3 - k * M x1 * a % M * a %…

尹成 雙循環鏈表

今天&#xff0c;我們一起用C寫一個雙鏈表&#xff0c;具體代碼如下&#xff1a; DoubleList.h具體內容如下&#xff1a; [cpp] view plaincopy #include "NodeList.h" template<typename Type> class DoublyList{ public: DoublyList() :head(ne…

堆的基本操作

堆的數據結構 對于堆, 有最大堆和最小堆, 在定義一個堆的時候用一個數組表示堆, 同時為了方便定義堆的大小, 用一個 size 表示堆的有效元素, 同時為了區別最大堆和最小堆, 我們用一個函數指針表示這個堆是最大堆還是最小堆. typedef int (*Compare)(HeapType parent, HeapTyp…

UVa1605

完完全全的構造題 一種比較好想到&#xff08;雖然我沒有想到。。&#xff09;的方法是做成一個兩層的表格&#xff0c;第一層每一行相同&#xff0c;第二層每一列相同&#xff0c;這樣每個都能和其他的相鄰了。 輸出格式稍微注意一下 #include<cstdio> #include<c…

Linux下的TCP/IP編程----IO復用及IO復用服務端

http://blog.csdn.net/wqc_csdn/article/details/51583901 在之前我們實現的并發服務端時通過床將多個進程來實現的&#xff0c;這種并實現并發的方式簡單方便&#xff0c;但是進程的創建和銷毀是很消耗系統資源的&#xff0c;在訪問量大時服務器很容易出現資源不夠用的情況。除…

UVa120

相當于是一個模擬&#xff0c;為了得到合適的順序&#xff0c;我們的策略是每次找到當前沒有被翻的里面最大的&#xff0c;然后把他翻到最前面&#xff0c;然后再翻到合適的位置。 需要判斷一下當前是否已經有序&#xff0c;有序就不用翻了。 如果在最開頭找到了合適的當前應…

二叉樹的相關操作

二叉樹的數據結構 typedef char SearchTreeType; typedef struct SearchTreeNode { SearchTreeType key; // 關鍵碼 struct SearchTreeNode* lchild; struct SearchTreeNode* rchild; } SearchTreeNode; 二叉樹的初始化 由于我們是用一個指向根節點的指針表示一個二叉樹, …

網絡層:網關協議

一. 網關 所謂的網管即就是之前路由器的名字, 即路由器和網關是一個東西 二. 內部網關協議 1. RIP協議 路由信息協議 RIP 是內部網關協議 IGP中最先得到的廣泛使用的協議. 同時 RIP 是一種分布式基于距離向量的路由選擇協議. RIP 協議要求網絡中的每一個路由都必須維護自己…

UVa1152

題意很好理解&#xff0c;就是從四個集合里面取出四個數字的和為0&#xff0c;問有多少種取法。 直接枚舉肯定是會超時的&#xff0c;所以得想辦法優化一下。我們可以將兩個集合的所有的和都放在一個數組里面&#xff0c;這樣得到兩個數組&#xff0c;然后排序&#xff0c;對第…

Linux函數--inet_pton / inet_ntop

http://blog.csdn.net/lindyl/article/details/10427925 inet_pton 和 inet_ntop Linux下這2個IP地址轉換函數&#xff0c;可以在將IP地址在“點分十進制”和“整數”之間轉換而且&#xff0c;inet_pton和inet_ntop這2個函數能夠處理ipv4和ipv6。算是比較新的函數了。 inet_pto…

網絡基礎: 淺析應用層一

應用層 1. http協議 在 http 中協議分為了協議方案名, 登錄信息名, 服務器地址, 服務器端口號(http協議綁定的端口號), 文件類型, 查詢的字符串, 片段標識位 2. http 請求協議格式 httpp 總共分為三大部分, 其中首行即就是第一部分, 分為三個區域, 第一去個區域是請方法, 第…